Aspect永远不会被调用

问题描述 投票:0回答:1

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

@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>

我在通用类中有一个公共方法(即不是由spring /而不是组件管理),它使用@MonitorExecution注释进行注释。我已成功验证上述方法被调用,但方面永远不会被触发。任何想法可能是什么问题?

java spring annotations aop spring-aop
1个回答
1
投票

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

尽管你仍然想要拦截它,但你必须只使用AspectJ或与Spring一起使用。对于第二个选项,您必须在弹簧配置中启用加载时编织

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

© www.soinside.com 2019 - 2024. All rights reserved.