Aspect不捕获Scheduled中的方法

问题描述 投票:0回答:2

当设置为来自cron的方法时,为什么注释的设置方面不起作用。

@Component
public class MyClass {
  @Scheduled(cron = "0/5 * * * * ?")
  public void schedule() {
    myMethod("test");
  }

  @MyAnno(cl = MyClass.class, description = "desc")
  private void myMethod(String text) {

  }
}

@Aspect
@Component
public MyAscpect {
  @Before("@annotation(myAnnoAnnotation)")
  public void myAnnoAspect(JoinPoint jp, MyAnno myAnnoAnnotation) {
}
java spring annotations scheduler spring-aop
2个回答
1
投票

Spring AOP

以下是关于Spring AOP应该记住的几点,

  1. 由于Spring的AOP框架基于代理的特性,目标对象内的调用根据定义不会被截获。
  2. 对于JDK代理,只能拦截代理上的公共接口方法调用。使用CGLIB,代理上的公共和受保护方法调用将被拦截,甚至包括必要的包可见方法。

你可以找到更多here

  • 由于您的方法myMethod是私有的,因此不会拦截对myMethod的调用。请参考上面提到的第二点。
  • 即使你的myMethod是公开的,如果通过myMethod方法进行调用,对schedule的调用也不会被截获。请参考上面提到的第一点。
  • 现在,如果您的myMethod是公开的,如果从对象外部直接调用myMethod方法,则会拦截对myMethod的调用。

AspectJ Source Weaving

但是,您可以通过利用AspectJ源编织来拦截私有方法。在源代码编织中,编织器成为编译器的一部分。编织器通过处理源代码并生成编织的Java字节码来充当编译器。它使用javac编译器而不是ajc编译器。

以下是您需要进行的更改:

  • 将Maven aspectj-maven-plugin插件添加到你的pom.xml
  • 如下所示,更改MyAspect的切入点以包括私有方法。 @Component @Aspect public class MyAspect { @Before("@annotation(myAnnoAnnotation) && execution(private * *(..))") public void myAnnoAspect(JoinPoint jp, MyAnno myAnnoAnnotation) { ... } } 你可以找到一个完整的工作示例here

0
投票

尝试按以下方式更改您的来源。

当然,带有main方法的应用程序类应该附加@EnableScheduling。

@Component
public class MyClass {
    @MyAnno
    @Scheduled(cron = "0/5 * * * * ?")
    public void schedule() {
        myMethod("test");
    }
    private void myMethod(String text) {
        //TODO enter your code.
    }
}

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

}

@Aspect
@Component
public class MyAnnoAspect{
    @Before("@annotation(MyAnno)")
    public void myAnnoAspect(JoinPoint jp) {

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.