说说 Spring AOP 和 AspectJ AOP 区别?
![](https://wx.javatiku.cn/j/j301-t.jpg)
说说 Spring AOP 和 AspectJ AOP 区别?
Spring AOP
Spring AOP采用运行时增强的方式,具有以下特点:
- 使用动态代理实现,如果目标类使用接口,则使用JDK动态代理;如果目标类是类,则使用CGLIB动态代理。
- Spring AOP依赖于IOC容器管理,并且只能应用于Spring容器中。它通过纯Java代码实现。
- 从性能上来说,由于Spring AOP基于动态代理实现,在容器启动时需要生成代理实例,并且方法调用会增加调用栈深度,所以性能比不上AspectJ。
- Spring AOP主要解决企业级开发中最常见的AOP需求,即方法级别的织入。
AspectJ
AspectJ是一个功能强大且易于使用的AOP框架,它属于编译时增强,并且可以作为独立的框架使用,也可以与其他框架集成。AspectJ需要使用独立的编译器ajc。
AspectJ属于静态织入,通过修改代码来实现,可以在实际运行之前完成织入,因此生成的类没有额外的运行时开销。AspectJ有几个常见的织入时机:
- 编译期织入(Compile-time weaving):例如,类A使用AspectJ添加了一个属性,类B引用了它,这种情况需要在编译期进行织入,否则无法编译类B。
- 编译后织入(Post-compile weaving):即在生成.class文件或打成jar包后进行织入的情况。
- 类加载后织入(Load-time weaving):指在加载类时进行织入。要实现此时期的织入,有几种常见的方法。
以上是Spring AOP和AspectJ的一些基本特点和区别。
整体对比如下: