2022-03-18

记录一次spring AOP不生效问题排查过程

先上代码

@Configuration
public class TestConfig{
    @Bean("abstractT")
    public static AbstractT abstractT(){
            return new B();
    }
}

public abstract class AbstractT {

    @TestAop
    public void sysout() {

    }
    
    pulic void test(){
        System.out.println();
    }
}


public class B extends AbstractT{
    @Override
    public void sysout() {
        System.out.println("This is B");
        this.cSysout();
    }

    @TestAop
    @Override
    public void test(){
        super.test()
    }

}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface TestAop {

}

@Component
@Aspect
public class TestAopAspect {

    @Around("@annotation(testAop)")
    public Object aop(ProceedingJoinPoint joinPoint, TestAop testAop) throws Throwable         {
      System.out.println("is in AOP");
      return joinPoint.proceed();
    }
}

  • 随后我发现,虽然我调用了class B sysout方法但是始终进不去切面(我能确保我的aop是好用的,类也已经注入了),我尝试变更过spring版本以及将我写的方法更换其他已经在使用的aop注解,发现依旧不好用

  • 后来我便尝试了一个比较笨的办法,就是再写一个类一步一步进行添加

@Service
public class C extends AbstractT{

    @TestAop
    public void sysout(){
        System.out.println("This is C");
    }
}
  • 我发现是好用的,有没有发现什么问题。! _ !

  • 问题的关键在于,class C是直接调用方法上标记了注解,而class B上确是通过内部方法使用this进行调用。这样就有问题了

结论

  • AOP 方法级别切面只能标记入口方法。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容