根本原因在于<aop:aspectj-autoproxy />这句话是在spring的配置文件内,还是在springmvc的配置文件内。如果是在spring的配置文件内,则@Controller中的方法不会被拦截。

看一下applicationContext.xml中bean扫描的配置,此处排除了controller层的扫描:

<context:component-scan base-package="com">
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<context:component-scan base-package="icom">
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>

看一下springmvc-servlet.xml中bean扫描的配置,此处排除了service层的扫描:

<context:component-scan base-package="com">
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
<context:component-scan base-package="icom">
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>

所以要拦截哪层的类中的方法,就应该在相应的配置文件中添加<aop:aspectj-autoproxy />

解决办法:

注释掉applicationContext.xml中的<aop:aspectj-autoproxy />,在springmvc-servlet.xml中配置:

<bean id="aspectBean" class="icom.axx.action.AopAspect" />
<aop:aspectj-autoproxy />

另外,不要忘记增加:

xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation=
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

除非整个web应用中只配置一个<component-scan>,且这个base-package同时包含了所有要扫描的包时,才会出现Controller的bean的初始化早于其它bean的情况。

如果是Spring的Bean扫描文件和spring-mvc-servlet中的的bean扫描文件是分开的,那么就是先扫描Spring的Bean;最后才扫描spring-mvc的bean。因为Spring的Bean是由监听器ContextLoaderListener负责扫描装载的,而spring-mvc的servlet-config.xml中配置的<component-scan>bean处于Servlet级别的,监听器的启动顺序自然要早于Servlet的启动顺序。

出现AOP切不到Controller的真正原因在于<aop:aspectj-autoproxy/>这句的位置。

更具体的原因:假如你在两份配置文件:spring-config.xml springmv-servlet.xml中都配置了扫描全部的包,那么你会发现所有的Bean都被先后实例化了一次,先spring-config.xml ;后 springmv-servlet.xml。两者实例化的Bean分别放在了父子容器中。

第一次初始化AController时,是在spring-config.xml 中(里面有aspectj-autoproxy配置),这时,这个AControllerBean就会被初始化为AOP代理对象,存在父容器中。

然后 springmv-servlet.xml中并没有aspectj-autoproxy,所以AControllerBean就是一个普通Bean,存在子容器中,没有被AOP代理。

当URL访问Controller时,就会用到子容器中的普通ControllerBean,所以AOP切不到。

所以在项目开发中,最好是明确职责边界,Spring-application-config.xml只负责核心的Bean初始化;springmvc-servlet-config.xml只负责和mvc相关的bean:比如Controller、HandlerMapping、HandlerAdapter.

参考:

https://www.cnblogs.com/Frank-Hao/p/5787813.html

 

Spring的Aspect切面类不能拦截Controller中的方法的更多相关文章

  1. Spring AOP无法拦截Controller中的方法

    想使用AOP Annotation配置Spring MVC的Controller进行拦截, 发现无法拦截Controller的方法, 却可以拦截Service层的方法. 一开始: Spring的配置文 ...

  2. spingAOP在springMVC中的使用(我用在拦截controller中的方法。主要用于登录控制)

    首先截取了网上的一张配置execution的图片 我在项目中关于aop的配置:如果拦截controller的方法,需要在spring-mvc.xml文件中加入(如果在spring.xml中加入则无法拦 ...

  3. ASP.NET MVC4在View中调用当前Controller中的方法

    调用当前Controller中的方法 @{ ((HomeController)ViewContext.Controller).Method1(); } 调用静态方法 @{ SomeClass.Meth ...

  4. spring AOP 之五:Spring MVC通过AOP切面编程来拦截controller

    示例1:通过包路径及类名规则为应用增加切面 该示例是通过拦截所有com.dxz.web.aop包下的以Controller结尾的所有类的所有方法,在方法执行前后打印和记录日志到数据库. 新建一个spr ...

  5. Spring MVC通过AOP切面编程 来拦截controller 实现日志的写入

    首选需要参考的是:[参考]http://www.cnblogs.com/guokai870510826/p/5977948.html    http://www.cnblogs.com/guokai8 ...

  6. spring MVC controller中的方法跳转到另外controller中的某个method的方法

    1. 需求背景     需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示. 本来以为挺简单的一 ...

  7. 反射找Controller中的方法

    /// <summary> /// 根据接口编码APICode,调用相应的webapi方法,注意返回值是json字符串 /// </summary> /// <param ...

  8. unity3D 中的C#脚本一个类调用另一类中简单方法

    案例展示 SubMenuManage类中的实例化代码如下: static SubMenuManage sub_this; public static SubMenuManage Instance() ...

  9. angularjs 外部调用controller中的方法

    angular.element(document.querySelector('[ng-controller=mainCtrl]')).scope().viewGo('tab.VIPPay_Succe ...

随机推荐

  1. JAVA8给我带了什么——流的概念和收集器

    到现在为止,笔者不敢给流下定义,从概念来讲他应该也是一种数据元素才是.可是在我们前面的代码例子中我们可以看到他更多的好像在表示他是一组处理数据的行为组合.这让笔者很难去理解他的定义.所以笔者不表态.各 ...

  2. MVC中权限的知识点及具体实现代码

    一:知识点部分 权限是做网页经常要涉及到的一个知识点,在使用MVC做权限设计时需要先了解以下知识: MVC中Url的执行是按照Controller->Action->View页面,但是我们 ...

  3. Java:终于找到了在alloy中的JFileChooser中的弹出式菜单不显示文字的解决办法

    alloy界面可以说是我写过的最漂亮的一种JAVA界面. 可惜不知为什么,至从几年前推出1.4版后,就再也没有更新了. 随着java版本的升级,一直很担心alloy有一天不再适用于java的最新版. ...

  4. 关于chrome控制台出现代码叠加页面不能正常显示大小问题

    见下图页面出现在chrome中的情况 描述状态:代码都变小了才出现控制台代码叠加问题 解决办法:使用鼠标滚轮放大代码就行啦,在设置里面让页面的大小显示为100%就可以了.

  5. git 合并连续的几个 commits

    命令 git rebase -i HEAD~[N],如 git rebase -i HEAD~3 合并最近 3 个 commit. 运行上述界面后会进入一个编辑界面,快捷键是 vim 的快捷键. 修改 ...

  6. 教你如何用Meterpreter渗透Win系统

    在这篇文章中,我们将跟大家介绍如何使用Meterpreter来收集目标Windows系统中的信息,获取用户凭证,创建我们自己的账号,启用远程桌面,进行屏幕截图,以及获取用户键盘记录等等. 相关Payl ...

  7. jsp中的request.getContextPath()

    jsp中的request.getContextPath()   <%=request.getContextPath()%>是为了解决相对路径的问题,可返回站点的根路径. 但不用也可以吧,比 ...

  8. JavaScript中对象分类

    js的对象有三大类,内部对象(本地对象和内置对象).宿主对象和自定义对象 一.内部对象 1.本地对象,ECMAScript提供的需要实例化(new)才能使用的对象: Object.Function.A ...

  9. selenium_基本用法

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  10. H5 localStorage sessionStorage

    localStorage 用于长久保存整个网站的数据,没有过期时间,除非手动去除. sessionStorage 会话存储,临时存储,当用户关闭浏览器窗口后,数据被删除. 共同方法 以 localSt ...