@AspectJ形式的 Spring AOP
为了方便理解,先加个说明:AspectJ是aop的一种技术,spring aop也是一种技术,他们是兄弟关系,可以互相替换的。@AspectJ是一种语法,最早是AspectJ引入的,spring aop借鉴了@AspectJ和其他的一些标签,用于替换xml配置形式,含义也基本相同,但是spring aop新写了一套语法解释器的代码,也就是说底层实现是不一样。
Spring 框架2.0版本发布之后, Spring AOP增加了新的特性,或者说增加了新的使用方式
-
支持 Aspect.5发布的@ AspectJ形式的AOP实现方式。
现在,我们可以直接使用POJO来定义Aspect以及相关的 Advice,并使用一套标准的注解标注这些POJO。 Spring AOP会根据注解信息查找相关的 Aspect定义,并将其声明的横切逻辑织入当前系统
-
简化了的XML配置方式。现在,使用新的基于XSD的配置方式,我们可以使用aop独有的命名空间,并且注册和使用POO形式实现的AOP概念实体。因为引入了 Aspect的 Pointcut描述语言,也可以在新的配置方式中使用 AspectJ形式的 Pointcut表达式。
但这只是从使用的角度来看。如果从更本质”一点儿的角度进行分析的话,我们会发现当升级到2.0版本之后,实际上如下两点是最主要的:
-
可以使用POJO声明 Aspect和相关的 Advice,而再也不用像1.x版本中那样,要实现特定的 Advice就需要实现规定的接口。
例如:MethodBeforeAdvice前置增强、AfterReturningAdvice后置增强等
-
获得了新的 Pointcut表述方式,因为现在引入了 AspectJ的 Pointcut表述语言,再也不用在“直接指定方法名”还是“使用正则表达式”之间选择了。至于说基于XSD的简化的配置方式,应该算是锦上添花之作
虽然2.0之后的 Spring AOP集成了 AspectJ,但实际上只能说是仅仅拿来 Aspec的“皮大衣”用一下。而底层各种概念的实现以及织入方式,依然使用的是 Spring1x原先的实现体系。这就好像我们中国人说中国话,而英语在世界上较为普及并且有范围较广的影响力,我们可以学习英语,把英语拿过来为我所用,但本质上,我们还是中国人,而不是英国人。换句话说, Spring AOP还是 Spring AOP,只不过多学了门外语而已。
spring aop是用java实现的,借鉴了@AspectJ的一些标签的名称,但是这些标签的实现仍然是spring用java写的。
下面让我们看一下当 Spring AOP拥有了 Aspect这种表达能力之后,同样的话该怎么来说吧!@ Aspect代表一种定义 Aspect的风格,它让我们能够以POJO的形式定义 Aspect,没有其他接口定义限制。唯一需要的,就是使用相应的注解标注这些 Aspect定义的POJO类。之后, Spring AOP会根据标注的注解搜索这些 Aspect定义类,然后将其织入系统。
这种方式是从AspectJ所引入的,定义的Aspect类基本可以在Spring AOP和 AspectJ之间通用。
就是说同样的语法,可以简单的复制粘贴到spring aop或AspectJ系统中都可以用,但是spring aop底层仍然使用的是代理模式的原理,只是增加了支持标签这种新的外在形式而已。
参考:
《31–基于@AspectJ的AOP》 一个简单的基于@AspectJ的AOP例子