简单说说SpringAOP与Aspectj的不同,以及使用Spr
首先,SpingAop与Aspectj在面向切面编程是关注的点不同。
Spring AOP的目的并不是为了提供最完整的AOP实现(虽然Spring AOP具有相当的能力);而是为了要帮助解决企业应用中的常见问题,提供一个AOP实现与Spring IOC之间的紧密集成,能够处理业务中的横切关注点。
Aspectj提供了非常完善的AOP能力,几乎能在java class的任何时刻使用织入功能。
AspectJ 的AOP,可以在三种时期进行代理,或者注入:
-
编译时织入
利用ajc编译器替代javac编译器,直接将源文件(java或者aspect文件)编译成class文件并将切面织入进代码。 -
编译后织入
利用ajc编译器向javac编译期编译后的class文件或jar文件织入切面代码。 -
加载时织入
不使用ajc编译器,利用aspectjweaver.jar工具,使用java agent代理在类加载期将切面织入进代码。
(aspectjweaver.jar中,存在着@Before,@After等注解,并且有他们织入的实现(ASM动态代理))
SpringAop仅仅依赖动态代理实现:
spring 的 AOP却完全只会使用Cglib或者JDK动态代理,在类加载时通过动态代理织入。因此,代理bean时,会受到bean的生命周期、声明方式而且产生一些制约问题。例如,JDK动态代理无法代理没有接口的JavaBean。
Aspectj影响了SpringAOP哪些东西?
按照https://www.colabug.com/2102191.html说法,AspectJ对AOP技术提供了两种概念:
-
切面语法:这个和spring aop 是类似的,切点表达式、连接点等术语和概念
-
织入工具:自己的AJC编译器,还有aspectjweaver.jar这种运行时代理工具
也就是说,SpingAOP具体的面向切面具体实现,和AspectJ是没有太大关系的,但是,这里强调一下,SpringAOP借用了AspectJ的概念,可以拿aspectjweaver中的一些功能,来为SPringAOP服务。例如切点、连接点、切点表达式、前置通知等等
并且,仿照AspectJ实现了自己的AOP功能。实际上,SpringAOP在功能上弱于AspectJ,因此,Spring也提供了对AspectJ的扩展Spring-aspects.jar和 Spring-instrument.jar,用来使用完整的AspectJ功能(在拥有IOC的前提下使用AspectJ,如果只用AspectJ提供的工具,就没有IOC了)。
使用springAOP需要哪些最小AOP相关的jar?
- aopalliance-1.0.0.jar(等价于com.springsource.org.aopalliance-1.0.0.jar)
- aspectj.weaver-xx.RELEASE.jar(等价于com.springsource.org.aspectj.weaver-xx.RELEASE.jar)
- spring-aop-xx.jar
在spring3.0以前,一些spring依赖的jar和spring一起发布,会在原包名前加上com.springsource,这个jar和单独发布的同版本没有什么不同,不影响使用。
只是现在,许多com.springsource.*已经不维护了,更新维护的只有单独发布的了。
在Spring4.0中,已经将aopalliance整合进spring-aop包中了,所以,在spring4.0以后使用Spring的AOP功能,所需最小依赖,仅仅spring-aop和aspectj.weaver两个jar就够了。