Spring AOP拦截对Controller的请求时的配置失败

之前学了Spring AOP的内容,在普通的应用上使用是没有问题的,后来由于做web程序,所以想用来拦截http的请求,以便记录日志,但是在配置过程当中,出现了错误,具体内容如下:

之前我们讲到,要配置一个切面类,要把它放入IoC容器中,并且还要使用如下代码配置:

但是用过Java Web开发应用的都知道,使用Spring时的配置文件可能会有两个(我是这么做的),一个就是用在全局范围内的applicationContext.xml(配置文件的名字可以改,我是按照默认的使用方式说明的),一个就是SpringMVC自己的配置文件,我在配置的时候是把配置信息放到了全局的配置文件中,发现切面怎么也不起作用,因为之前的使用方式就是这样的,后来在网上搜索,发现好多种说法,但是大家都默认, 当拦截controller的方法时把配置信息放到了springMVC的配置文件中了,但是没说明这是为什么,抱着一种不达目的不罢休的精神又在网上搜索,终于找到答案。下面我就把几篇相关的文章贴出来,如果有和我相同问题的人,希望可以帮助到你。

相关文章:

  • 问题和我一样,但是正确决问题:http://stackoverflow.com/questions/21352560/pointcut-not-triggered-in-spring-controller
  • 问题和我一样,但是解决方式不同,试了他的方法,没有解决(怀疑是不是Spring的版本不同):http://stackoverflow.com/questions/26841785/springmvcaspectj-not-called
  • 问题和我一样,并且解决问题,但是没说为什么:http://newliferen.github.io/2015/08/10/Spring-aop%E6%97%A0%E6%B3%95%E6%8B%A6%E6%88%AAcontroller/
  • 看了解决方式才发现问题可能和我一样,并且说明了问什么:https://segmentfault.com/q/1010000003901757

下面我把最后一篇文章的解决方式引用过来,感谢这位朋友:

简单的说,就是父子容器的问题,将AOP的配置信息放在applicationContext.xml中,该配置文件被ContextLoaderListener加载,Spring会创建一个WebApplicationContext的上下文,称为父上下文(父容器),保存在 ServletContext中,key值为WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE。而spring-mvc.xml是DispatcherServlet 的配置文件,这样的servlet可以同时配置多个,每个 DispatcherServlet有一个自己的上下文对象(WebApplicationContext),称为子上下文(子容器),子上下文可以访问父上下文中的内容,但父上下文不能访问子上下文中的内容。 它也保存在 ServletContext中, key值是"org.springframework.web.servlet.FrameworkServlet.CONTEXT"+Servlet名称。当spring加载父容器的时候就会去找切入点,但是这个时候切入的controller是在子容器中的,父容器是无法访问子容器,所以就拦截不到。

你可能感兴趣的:(Spring)