说说 Spring AOP 和 AspectJ AOP 区别?

Spring AOP

Spring AOP采用运行时增强的方式,具有以下特点:

  1. 使用动态代理实现,如果目标类使用接口,则使用JDK动态代理;如果目标类是类,则使用CGLIB动态代理。
  2. Spring AOP依赖于IOC容器管理,并且只能应用于Spring容器中。它通过纯Java代码实现。
  3. 从性能上来说,由于Spring AOP基于动态代理实现,在容器启动时需要生成代理实例,并且方法调用会增加调用栈深度,所以性能比不上AspectJ。
  4. Spring AOP主要解决企业级开发中最常见的AOP需求,即方法级别的织入。

AspectJ

AspectJ是一个功能强大且易于使用的AOP框架,它属于编译时增强,并且可以作为独立的框架使用,也可以与其他框架集成。AspectJ需要使用独立的编译器ajc。

AspectJ属于静态织入,通过修改代码来实现,可以在实际运行之前完成织入,因此生成的类没有额外的运行时开销。AspectJ有几个常见的织入时机:

  1. 编译期织入(Compile-time weaving):例如,类A使用AspectJ添加了一个属性,类B引用了它,这种情况需要在编译期进行织入,否则无法编译类B。
  2. 编译后织入(Post-compile weaving):即在生成.class文件或打成jar包后进行织入的情况。
  3. 类加载后织入(Load-time weaving):指在加载类时进行织入。要实现此时期的织入,有几种常见的方法。

以上是Spring AOP和AspectJ的一些基本特点和区别。

整体对比如下:

spring-d1dbe9d9-c55f-4293-8622-d9759064d613.png

标签: none