当设置为来自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) {
}
以下是关于Spring AOP应该记住的几点,
你可以找到更多here。
myMethod
是私有的,因此不会拦截对myMethod
的调用。请参考上面提到的第二点。myMethod
是公开的,如果通过myMethod
方法进行调用,对schedule
的调用也不会被截获。请参考上面提到的第一点。myMethod
是公开的,如果从对象外部直接调用myMethod
方法,则会拦截对myMethod
的调用。但是,您可以通过利用AspectJ源编织来拦截私有方法。在源代码编织中,编织器成为编译器的一部分。编织器通过处理源代码并生成编织的Java字节码来充当编译器。它使用javac
编译器而不是ajc
编译器。
以下是您需要进行的更改:
aspectj-maven-plugin
插件添加到你的pom.xml
MyAspect
的切入点以包括私有方法。
@Component
@Aspect
public class MyAspect {
@Before("@annotation(myAnnoAnnotation) && execution(private * *(..))")
public void myAnnoAspect(JoinPoint jp, MyAnno myAnnoAnnotation) {
...
}
}
你可以找到一个完整的工作示例here。尝试按以下方式更改您的来源。
当然,带有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) {
}
}