zoukankan      html  css  js  c++  java
  • spring aop无法拦截类内部的方法调用

    1.概念

    拦截器的实现原理就是动态代理,实现AOP机制。Spring 的代理实现有两种:一是基于 JDK Dynamic Proxy 技术而实现的;二是基于 CGLIB 技术而实现的。如果目标对象实现了接口,在默认情况下Spring会采用JDK的动态代理实现AOP

    2.问题

    在类C中,方法A调用方法B,

    B方法被AOP拦截。(可能是方法B上在另外的@Aspect切面定义上了切点/也可能是加了@Transactional事务注解,底层原理也是AOP实现),最终A-》B ,B并不会触发AOP。

    3.解决方案

    1.手动获取代理对象

    1.将当前的代理类暴露给线程使用,以下2种自己选一个实现即可。

    注解实现方案:springboot:启动类上加注解:@EnableAspectJAutoProxy(exposeProxy=true):

    配置实现方案:<aop:aspectj-autoproxy expose-proxy="true" />

    2.A中调用B:不要直接用this(因为this是目标对象,自然无法实现代理类的增强方法@before等),而是先去尝试获取代理类:UserServiceImpl service = AopContext.currentProxy() != null ? (UserService)AopContext.currentProxy() : this;

    2.去除AOP切面增强,把切面方法单独封装接口方法,在需要的地方调用

  • 相关阅读:
    2021寒假每日一题《棋盘挑战》
    2021寒假每日一题《货币系统》
    2021寒假每日一题《红与黑》
    2021寒假每日一题《字母图形》
    2021寒假每日一题《完全背包问题》
    2021寒假每日一题《找硬币》
    python 迭代器和生成器
    python for循环
    python集合
    python字符串常用操作
  • 原文地址:https://www.cnblogs.com/dennyzhangdd/p/9242148.html
Copyright © 2011-2022 走看看