记录一次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 方法级别切面只能标记入口方法。