简单说说SpringAOP与Aspectj的不同,以及使用SpringAOP所需的最小jar依赖

首先,SpingAop与Aspectj在面向切面编程是关注的点不同。

Spring AOP的目的并不是为了提供最完整的AOP实现(虽然Spring AOP具有相当的能力);而是为了要帮助解决企业应用中的常见问题,提供一个AOP实现与Spring IOC之间的紧密集成,能够处理业务中的横切关注点。
Aspectj提供了非常完善的AOP能力,几乎能在java class的任何时刻使用织入功能。

AspectJ 的AOP,可以在三种时期进行代理,或者注入:

  1. 编译时织入
    利用ajc编译器替代javac编译器,直接将源文件(java或者aspect文件)编译成class文件并将切面织入进代码。

  2. 编译后织入
    利用ajc编译器向javac编译期编译后的class文件或jar文件织入切面代码。

  3. 加载时织入
    不使用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就够了。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值