问题:
spring aop 默认使用jdk代理织入。
也就是我们常这样配置:<aop:aspectj-autoproxy />
通过aop命名空间的<aop:aspectj-autoproxy />声明自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面。当然,spring
在内部依旧采用AnnotationAwareAspectJAutoProxyCreator进行自动代理的创建工作,但具体实现的细节已经被<aop:aspectj-autoproxy />隐藏起来了
<aop:aspectj-autoproxy />有一个proxy-target-class属性,默认为false,表示使用jdk动态代理织入增强,当配为<aop:aspectj-autoproxy poxy-target- class="true"/>时,表示使用CGLib动态代理技术织入增强。
疑问:
平时我们开发的时候会在controller 做切面做操作 记录。
@Controller
@RequestMapping("loginLog")
public class LoginLogController {。。。。}
我们的controller 没有实现接口啊。再使用jdk代理好吗?
网友解答:
即使proxy-target-class设置为false,如果目标类没有声明接口,则spring将自动使用CGLib动态代理
(不知道这样对不对?????????)
问这个问题的意义:
我在做数据同步的时候。使用切面的形式 切换数据源。这时候遇到一个问题。就是 mybatis的 mapper 接口切不到。百度后我们使用 CGLib动态代理 ;也就是proxy-target-class=true。 所以修改为 false 。
引发了另一个问题: 配置的 位置问题
http://blog.csdn.net/my_nice_life/article/details/52910718
http://www.cnblogs.com/hustyangli/archive/2008/09/01/1281319.html
总结: spring很智能。