关于切面失效的问题分析-在spring的bean内部方法调用无法使用AOP切面

背景:测试环境存在切面未生效

1.问题描述:切面失效

代码自定义@Diff注解,使用DiffAspect切面做了部分其他操作,但代理未生效

class ServiceA{
   public void method(){
        //调用方法 methodA, 但@diff 注解未生效
        serviceA.methodA();
    }

    @Diff(xx)
    public void methodA(){
		 //....
    }

}

配置一个DiffAspect切面,理论上只要使用@Diff注解的方法都会被代理,并没有

public class DiffAspect{
  	//...
    @Around("@annotation(com.xx.Diff)")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
	}
  //....
}

2.问题分析:

原因是内部调用的对象是this,而非Spring容器代理的对象,故代理失效。

3.问题解决

使用AopContext.currentProxy() 获取当前代理类

    class ServiceA{

        public void method(){
            //1.获取当前代理类
            ServiceA currentProxy = (ServiceA) AopContext.currentProxy();
            //2.调用代理方法
            serviceA.methodA();
        }

        @Diff(xx)
        public void methodA(){

        }

    }
posted @ 2022-06-29 21:19  执大象  阅读(1073)  评论(0)    收藏  举报