我有一个方面类:
@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上其他答案的建议,我已将以下内容添加到我的spring配置中:
<context:annotation-config/>
...
<context:component-scan base-package="com.application.core"/>
...
<aop:aspectj-autoproxy />
现在所有的都不起作用了。我的 API 调用中,即
/login
,所需的建议未执行。
<aop:aspectj-autoproxy />
?如果它在你的根应用程序上下文中(即ContextLoaderListener
),那么它对你的控制器将完全没有作用。此外,你还需要在<aop:aspectj-autoproxy />
上启用proxy-target-class="true"
,才能使其对控制器起作用。 - M. Deinum@Pointcut(@annotation(com.application.aspect.annotation.LoggedRequest))
然后尝试调用您已注释的方法。 - mlewandowskispring-aop
和aspectjweaver
? - Michał KosmulskiDispatcherServlet
加载的上下文中,AOP仅适用于同一应用程序上下文中的bean,而不适用于父级或子级上下文中的bean。 - M. Deinum