zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    JS浮点数的加减乘除运算
    鼓励心里的阳光
    mysql创建新用户并分配数据库权限
    CentOS下的Memcache安装步骤(Linux+Nginx+PHP+Memcached)
    Python发送邮件
    SQL操作语句
    Mysql数据库操作语句
    Cookie,Session的区别
    Jmeter性能测试-分布式压力测试
    性能测试指标
  • 原文地址:https://www.cnblogs.com/cnsec/p/13547559.html
Copyright © 2011-2022 走看看