我有以下方面的方面:
@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应用程序中,您将同时拥有ContextLoaderListener
和DispatcherServlet
两者创建一个ApplicationContext
。在ContextLoaderListener
创建所谓的根应用程序上下文和DispatcherServlet
一个相对于根上下文的子上下文。
从根开始的AOP配置不会影响子上下文中的bean,而在子上下文中的AOP配置不会影响根上下文中的bean。
现在,您已经在方面和<aop:aspectj-autoproxy />
根上下文中配置了方面,除了它适用于存在于子上下文中的Bean。那显然是行不通的。将该配置移动(或复制)到子上下文中。
另一件事是,您将需要基于类的代理,因为yu没有接口,因此您可能还想添加proxy-target-class="true"
到<aop:aspectj-autoproxy />
元素中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句