Spring AOP和AspectJ
- AspectJ功能更全面,而Spring AOP注重和Spring IoC容器结合。
- AspectJ实现上依赖于特殊编译器(ajc编译器)(静态织入),Spring使用动态代理技术来避免这个问题(动态织入)。
基于@AspectJ注解 和 基于XML风格
- Spring AOP两种都可选择。
- XML风格有2个缺点:
- 没有完全封装在一个地方,需求知识被分解为支持bean类的声明和配置文件XML。而@AspectJ注解,所有信息都封装在aspect模块中。
- XML风格只支持“singleton”,不能组合XML中声明的切入点。
代理机制:JDK动态代理 和 CGLIB代理
- Spring AOP默认下如果要代理的对象实现了至少一个接口,则使用JDK动态代理,如果没有实现任何接口,则创建一个CGLIB代理。
- CGLIB代理中final方法不被通知,因为不能被覆盖。