微信号:javajidi_com

介绍:专注Java与Web技术的研究;分享有价值的技术;经验;关注程序员的发展.

spring基于schema advisor的配置实现aop

2015-05-13 10:32 强哥

欢迎大家来Java基地(http://www.javajidi.com)交流技术问题,分享技术经验。


前面我们已经知道,spring中切面用Advisor表示,但是在aspectj中没有advisor对应的等价物。在基于schema的aop配置中,如果项目不想使用aspectj或者不支持aspectj,我们怎么使用shcema实现aop配置呢?spring提供了<aop:advisor>标签来完成这个功能。
advisor表示切面,因此很自然它需要切点和增强两个信息。在advisor标签中也能很好的体现出来。
<aop:config>
<aop:pointcut id="allTestServiceMethod" expression="execution(* com.service.*.*(..))"/>
<aop:advisor pointcut-ref="allTestServiceMethod" advice-ref="TestAdvice" />
</aop:config>

需要注意的是,advice-ref所引用的bean应该是实现了某种Advice接口的bean,比如实现了BeforeAdvice接口。
看到这里,你会惊奇的发现,原来经常使用的spring声明式事务的配置正式这样。知道前前后后的原理,从此你就不再是简单的复制粘贴事务配置代码了吧。
同样,<aop:config>标签有一个proxy-target-class的属性,表示是否对类进行代理,如果设置为true,将使用cglib库创建代理,而不是jdk动态代理。
到目前为止,我们已经知道至少有四种方式实现aop了。
1.通过实现相应的aop相关接口,通过自动创建代理bean对相关的目标对象创建代理实现。
2.通过使用@AspectJ注解结合AnnotationAwareAspectJAutoProxyCreator自动创建目标对象的代理。
3.通过<aop:aspect>定义切面。
4.通过<aop:advisor>定义切面。
实际上,四种方式底层的原理是一样的,只是表现形式不同而已。当然,第一种和第二种方式显然比较笨重,实际中很少采用这种方式。如果项目支持aspectj,我们可以优先使用它,它的表达式更灵活更强大。如果项目采用的是比较低的spring版本,或者使用的是jdk5以下的jdk,那么就只能使用advisor了。

关注微信公众号 javajidi_com,可以实时获取有价值的技术文章推送。
"Java基地"交流群:245130488


 
Java技术 更多文章 准备进入码农行业?你准备好了吗 Java是怎样运行的,你敢说真的知道? Java:怎样理解byte的最大值是2^7-1 交换思想在程序设计中的应用 Java:线程初识
猜您喜欢 一个32岁入门的70后程序员给我的启示 R语言入门第十讲:使用函数sample进行抽样 CDH大数据平台搭建 联想智能手机出海 能复制PC的成功吗? 小米海量数据推送服务技术讲解