首页 > 技术文章 > spring aop 的一个思考

smallstudent 2017-01-10 17:07 原文

问题:

  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很智能。

 

   

推荐阅读