• 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切面增强,把切面方法单独封装接口方法,在需要的地方调用

  • 相关阅读:
    【模板】并查集
    P1063能量项链
    多维动归第一题
    7.14测试
    7.12测试
    7.10测试
    几种display:table-cell的应用
    instanceof和typeof的区别
    右侧悬浮广告
    JavaScript判断浏览器类型及版本
  • 原文地址:https://www.cnblogs.com/dennyzhangdd/p/9242148.html
Copyright © 2020-2023  润新知