2016年8月24日星期三

spring aop vs aspectj

AspectJ是编译期间修改代码,属于静态编入,不需要代理类。spring aop基于代理的,用的是aopalliance(aopalliance只是一个规范接口,不是实现),是运行期间植入,是动态植入,没自己的代理,得通过cglib或者jdk代理实现。jdk的出发实现了interface的object,缺不能促发没有实现任何interface的object。如果设置了proxy-target-class="true",就可以用cglib去触发。

静态编入 比 动态编入 应该效率好一些。  spring-aop不好用,没有注解,所以搞出来spring-aspects, 靠注解就能搞定,spring-aspects其实和AspectJ没有任何关系,没有用到aspect的实现,只是用了AspectJ的类定义,所以它不是编译植入,而是动态植入,所以也需要代理实现(jdk或者cglib)


http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-proxying
这个proxy-target-class,虽然可以在好几个个地方设置,但是其实只要设置一个地方,就影响到所有,也就是只要一个地方设置为true,那么就都是true。
<aop:config proxy-target-class="true"/>
<aop:aspectj-autoproxy proxy-target-class="true">
<tx:annotation-driven proxy-target-class="true"/> 
<task:annotation-driven proxy-target-class="true"/>
<cache:annotation-driven proxy-target-class="true/>
 ...

文档是这么写的,既然都是一票定,为啥还要搞一个
ScopedProxyMode?
proxyMode = ScopedProxyMode.TARGET_CLASS还能以bean单位进行的定义? 


找了个文章
http://www.udpwork.com/item/15373.html 

这个文字的意思
>>这个的答案是,aspectj虽然是静态,但spring-aspectj还是动态。用了@Aspectj注释的,就算method不是public的,也起作用,就多这么一个好处+可以不xml而可以注解来设置? 如果只是这样,@Aspectj用处就不算啥了。
 

没有评论:

发表评论