为什么当将注释设置为来自 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
以下是关于 Spring AOP 应该记住的要点,
-
Due to the proxy-based nature of Spring’s AOP framework, calls within the target object are by definition not intercepted.
-
For JDK proxies, only public interface method calls on the proxy can be intercepted. With CGLIB, public and protected method calls on the proxy will be intercepted, and even package-visible methods if necessary.
您可以找到更多here .
- 自从你的方法
myMethod
是私有(private),调用myMethod
不会被拦截。请引用上面提到的第二点。 - 即使您的
myMethod
是公开,调用myMethod
如果通过schedule
进行调用,则不会被拦截方法。请引用上面提到的第一点。 - 现在,如果您的
myMethod
是公开,调用myMethod
如果直接调用myMethod
将会被拦截来自对象外部的方法。
AspectJ 源编织
但是,您可以利用 AspectJ 源编织来拦截私有(private)方法。在源编织中,编织器成为编译器的一部分。
编织器充当编译器,处理源代码并生成编织的 Java 字节码。而不是javac
编译器,它使用 ajc
编译器。
以下是您需要进行的更改:
- 添加 Maven
aspectj-maven-plugin
插件到您的pom.xml
如下所示,更改为
MyAspect
的切入点包含私有(private)方法。@Component @Aspect public class MyAspect { @Before("@annotation(myAnnoAnnotation) && execution(private * *(..))") public void myAnnoAspect(JoinPoint jp, MyAnno myAnnoAnnotation) { ... } }
您可以找到完整的工作示例 here .
关于java - 方面未从计划中捕获方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47072554/