Sprint AOP代理的使用
Posted on: 2013-09-07, Last modified: 2015-07-31, View: 2917
Posted on: 2013-09-07, Last modified: 2015-07-31, View: 2917
Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理。Spring默认会使用jdk动态代理创建对象,如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理。所有该目标类型实现的接口都将被代理。若该目标对象没有实现任何接口,则创建一个CGLIB代理。但是如果采用CGLIB代理方式,因为要通过生成被代理类的子类实现,所以在被代理类里不能有final方法出现。不过cglib方式效率会稍好于jdk动态代理方式,关键是不用为每个业务类实现接口,对于小项目特别是个人项目比较合适,这种情况接口变得没有那么迫切需要。cglib所创建的动态代理对象的性能比jdk的高大概10倍,但cglib在创建代理对象的时候时间比jdk大概多8倍,所以对于singleton的代理对象或者具有实力池的代理,因为无需重复的创建代理对象,所以比较适合cglib动态代理技术,反之选择jdk代理。
如果要采用cglib代理方式,要引用额外的jar包aspectjrt-1.7.3.jar和aspectjweaver-1.5.4.jar,并在配置文件中设置标志位以便spring在实例化对象时采用cglib方式,具体方法如下:
1. 下载并在项目总引入aspectjrt-1.7.3.jar和aspectjweaver-1.5.4.jar,如果采用maven管理项目只要添加相关dependency即可:
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.7.3</version> </dependency> <dependency> <groupId>aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.5.4</version> </dependency>
2.在spring的配置文件,例如applicationContext.xml里添加
<aop:aspectj-autoproxy proxy-target-class="true"/>
关于这两种代理实现方式的区别,推荐一篇分析更详细的文章:http://jinnianshilongnian.iteye.com/blog/1508018