故事是这样的,想记录一个controller里面的部分数据到数据库中(因为只有三行代码就犯懒没有再写service),controller在SpringMVC的配置文件扫描,其他应该扫描的在spring配置文件扫描
实现如下:
@Aspect
@Component
public class XXXLogRecorder {
@Around("execution(* XXX.controller.XXXSearchController.availXXX(..))")
public Object logHotelAvailStatusByMonth(ProceedingJoinPoint joinPoint) throws Throwable {
//...
}
}结果增么都进入不了这个方法中。
原因如下:spring和springMVC是两个不同的容器,因为controller是springMVC容器加载的,而XXXLogRecorder是spring容器加载的,是无法互通的,所以AOP未生效。
更改方式:把XXXLogRecorder的生成管理交给springMVC容器。
即去掉@Component注解,然后在springMVC的配置文件中手动创建XXXLogRecorder
@Aspect
public class XXXLogRecorder {
@Around("execution(* XXX.controller.XXXSearchController.availXXX(..))")
public Object logHotelAvailStatusByMonth(ProceedingJoinPoint joinPoint) throws Throwable {
//...
}
}在springMVC配置文件中添加:
<bean id="xxxLogRecorder" class="xxx.log.XXXLogRecorder"/>
本文讲述了在使用SpringMVC时遇到的一个AOP(面向切面编程)不生效的问题。由于Controller在SpringMVC容器中,而日志记录组件在Spring容器中,导致两者无法互通,从而使得AOP无法正常工作。解决方案是将日志记录组件的管理转移到SpringMVC容器中,通过在SpringMVC配置文件中手动创建该组件,从而使AOP生效。
3376

被折叠的 条评论
为什么被折叠?



