Spring AOP注释不起作用

塔里克

我有以下方面的方面:

@Component
@Aspect
public class LoggedRequestAspect {

    private static final Logger LOG = LoggerFactory.getLogger(LoggedRequestAspect.class);

    @Before("com.application.aspect.pointcut.LoggedRequestPointCut.LogRequest()")
    public void logRequest(){
        System.out.println("Method Executed!");
        LOG.debug("Method Executed!");
    }
}

对于注释类:

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

最后切入点:

public class LoggedRequestPointCut {

    @Pointcut("execution(@com.application.aspect.annotation.LoggedRequest * *(..))")
    public void LogRequest(){}

}

现在确定,我已经在控制器中注释了必需的api方法:

...
    @LoggedRequest
    @RequestMapping(value = "/login", method = { RequestMethod.POST })
    public @ResponseBody Map<String, Object> login(/* Param List*/){

...
    }

正如关于SO的许多其他答案所建议的那样。我在弹簧配置中添加了以下内容:

<context:annotation-config/>
...
<context:component-scan base-package="com.application.core"/>
...
<aop:aspectj-autoproxy />

现在所有这一切都不起作用。我的意思是我的API调用/login所需的建议未执行。

然后马库斯

在Spring中在bean上使用AOP时,该操作仅适用于同一应用程序上下文中的bean。

在典型的Web应用程序中,您将同时拥有ContextLoaderListenerDispatcherServlet两者创建一个ApplicationContextContextLoaderListener创建所谓的根应用程序上下文和DispatcherServlet一个相对于根上下文的子上下文。

从根开始的AOP配置不会影响子上下文中的bean,而在子上下文中的AOP配置不会影响根上下文中的bean。

现在,您已经在方面和<aop:aspectj-autoproxy />根上下文中配置了方面,除了它适用于存在于子上下文中的Bean。那显然是行不通的。将该配置移动(或复制)到子上下文中。

另一件事是,您将需要基于类的代理,因为yu没有接口,因此您可能还想添加proxy-target-class="true"<aop:aspectj-autoproxy />元素中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章