java - 方面未从计划中捕获方法

标签 java spring annotations scheduler spring-aop

为什么当将注释设置为来自 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 应该记住的要点,

  1. Due to the proxy-based nature of Spring’s AOP framework, calls within the target object are by definition not intercepted.

  2. 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/

相关文章:

spring - 是否可以在 Spring WS web 服务中重命名响应 namespace 前缀?

Java:跟踪动态加载类的执行

java - 使用 JPA : what queries should I write to get the same result I get in JDBC? 加入

java - Spring 中使用 Pagination/Page 的表别名中的 JPA 未知列

java - 垃圾收集器占用太多 CPU 时间

java - 使用 ajax get 发送数据时出现错误

python - 使用 spaCy 通过 BIO 方案注释文本

java - 在 Java 中使用注释验证字符串列表

java - 点燃检查异常 : Failed to start processor: GridProcessorAdapter []

java - 如何使用 Bouncy CaSTLe 在 Java 中编辑密码套件列表