Java 方面不从计划中捕获方法
当注释的set方面被设置为cron中的方法时,为什么它不起作用Java 方面不从计划中捕获方法,java,spring,annotations,scheduler,spring-aop,Java,Spring,Annotations,Scheduler,Spring Aop,当注释的set方面被设置为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) {
@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) {
}
面向方面编程
以下是您应该记住的关于Spring AOP的要点
- 由于您的方法
是private,因此不会拦截对myMethod
的调用。请参阅上文提到的第二点myMethod
- 即使您的
是public,如果调用是通过myMethod
方法进行的,对schedule
的调用也不会被拦截。请参考上文提到的第一点myMethod
- 现在,如果您的
是public,那么如果从对象外部直接调用myMethod
方法,则会拦截对myMethod
的调用myMethod
javac
编译器,而是使用ajc
编译器
以下是您需要进行的更改:
- 将Maven
aspectj Maven插件添加到您的
pom.xml
- 如下所示,将
的切入点更改为包含private方法MyAspect
您可以找到一个完整的工作示例@Component @Aspect public class MyAspect { @Before("@annotation(myAnnoAnnotation) && execution(private * *(..))") public void myAnnoAspect(JoinPoint jp, MyAnno myAnnoAnnotation) { ... } }
@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) {
}
}
这里的问题到底是什么。你能说清楚吗。在不同的方法上有
@scehduled
,在不同的方法上有@MyAnno
。这有什么关系?MyAnnoSpect方法在调用myMethod后从不执行。我对另一个批注有相同的类结构,并且它可以工作(没有@Scheduled)。在
批注之前有,这意味着MyAnnoSpect
应该在myMethod
之前执行