问题: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配置的方式和定义切面时范围尽量精确可以很大程度避免发生这个问题。