java - 方面永远不会被调用

标签 java spring annotations aop spring-aop

我的目标是每次带有特定注释的方法完成执行时执行一些代码。我有以下内容:

@Aspect
public class MonitoringAspect {
    @After("@annotation(MonitorExecution)")
    public void onFinished(JoinPoint jp) {
        System.out.println("called!");
    }
}

MonitorExecution注解的代码如下:

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

这发生在 Spring4 应用程序内部,我已将 MonitoringAspect 声明为一个 bean,如下所示:

<bean id="monitoringAspect" class="com.....MonitoringAspect" />
<aop:aspectj-autoproxy proxy-target-class="true">
    <aop:include name="monitoringAspect"/>
</aop:aspectj-autoproxy>

我在通用类中有一个公共(public)方法(即不由 spring 管理/不是组件),并用 @MonitorExecution 注释进行注释。我已经成功验证了上述方法被调用,但该方面从未被触发。有什么想法可能是什么问题吗?

最佳答案

aspectj-autoproxy 意味着将为每个 Spring 托管 bean 创建代理类(使用 JDK 动态代理或 CGLIB),并且使用这些代理您可以拦截方法调用。因此,如果您的注释方法是 Spring Context 之外的类的方法,则方面将不起作用

尽管如此,如果您仍然想拦截它,则必须仅使用 AspectJ 或与 Spring 结合使用。对于第二个选项,您必须在 spring 配置中启用加载时编织

查看文档了解详细信息: https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aop

关于java - 方面永远不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48099648/

相关文章:

spring - Hibernate AnnotationException - Spring 5 和 Hibernate 5 映射实体

java - 在哪里放置 hibernate 注释?

java - removeIf 中的 lambda

java - spring boot maven没有将jsp文件打包到 "fat jar"

Java - 返回由两个不同表组成的对象的 Spring 引导查询

java - 当太多并行上传(堆空间)时,JVM/Tomcat 崩溃?

java - java 中的参数检查或契约设计 (GWT)。从哪儿开始?

java - 变量的值在远程进程中不会改变

java - 在replaceAll()方法中调用replace替换字符串

java - 我们什么时候应该使用@PreAuthorize 和@Secured