目前关于AOP有2种较为成熟的解决方案,一个是Spring AOP,另一个是AspectJ,二者区别是一个采用静态织入一个采用动态织入。
静态织入有3个时机:
- 编译期,采用特殊编译器(例如,aspectJ使用ajc编译器)把相应的增强织入到编译时产生的字节码文件中。
- 编译后,编译后通过修改编程生成的字节码文件完成对增强的织入。
- 加载期,在类加载时通过定制类加载器对字节码文件进行修改把增强织入。
动态织入就是在运行期间根据代码执行情况织入增强,本质还是修改字节码。目前Spring AOP采用的是动态织入,所用技术是JDK动态代理和CGLib动态代理。Spring AOP并没有直接使用AspectJ,只是使用了它的注解,为了向程序员使用习惯兼容,毕竟AspectJ出现较早,流行较早,目前很多老程序员还是对其非常熟悉,就像Java为了兼容C和C++程序员在使用自己的数组声明方式的同时还保留了C和C++的数组声明方式。