Spring AOP 二次代理失效问题

问题:Spring AOP无效。

原因:AOP二次代理的问题

公司的Spring项目比较庞大,由不同的部门开发实现。BT对Spring进行了封装和魔改。BT和业务组都有对Controller层的AOP,分别采用了AspectJ,CGLib,JDK Proxy等不同的方式,在不同的位置进行注册和声明。导致二次代理的问题的产生,业务组的AOP失效。

伪流程:

1.配置文件注册第一个ProxyCreator,通过Advisor定义了一个切面,规则是所有package.controller下的类生效。这时beanPostProcessors就有了就有了两个ProxyCreator,首先第一个ProxyCreator对controller进行处理,因为controller没有实现任何接口,所以采用CGlib生成了代理对象,代理对象的类型是FirstController$$EnhancerBySpringCGLIB,同时实现了三个接口:org.springframework.aop.SpringProxy
org.springframework.aop.framework.Advised
org.springframework.cglib.proxy.Factory
2.注解注册第二个ProxyCreator对这个代理对象进行处理,该代理对象的类的package也是package.controller,仍然符合切面的规则。因为该代理对象实现了三个接口,所以就使用JDK基于接口的动态代理生成代理对象。代理对象的类型是$Proxy,package是com.sun.proxy。

3.不再符合切面的规则,即使后面仍然有更多的ProxyCreator,也不会再基于当前的代理对象生成一个新的代理对象。

总结:

尽量统一配置,不要分散在多处/使用多种方式配置。

不要使用多种AOP配置的方式和定义切面时范围尽量精确可以很大程度避免发生这个问题。

 

https://blog.csdn.net/fatshaw/article/details/51619994

https://www.jianshu.com/p/0478bf7a99f5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值