Spring的Aspect切面类不能拦截Controller中的方法
根本原因在于<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中的方法的更多相关文章
- Spring AOP无法拦截Controller中的方法
想使用AOP Annotation配置Spring MVC的Controller进行拦截, 发现无法拦截Controller的方法, 却可以拦截Service层的方法. 一开始: Spring的配置文 ...
- spingAOP在springMVC中的使用(我用在拦截controller中的方法。主要用于登录控制)
首先截取了网上的一张配置execution的图片 我在项目中关于aop的配置:如果拦截controller的方法,需要在spring-mvc.xml文件中加入(如果在spring.xml中加入则无法拦 ...
- ASP.NET MVC4在View中调用当前Controller中的方法
调用当前Controller中的方法 @{ ((HomeController)ViewContext.Controller).Method1(); } 调用静态方法 @{ SomeClass.Meth ...
- spring AOP 之五:Spring MVC通过AOP切面编程来拦截controller
示例1:通过包路径及类名规则为应用增加切面 该示例是通过拦截所有com.dxz.web.aop包下的以Controller结尾的所有类的所有方法,在方法执行前后打印和记录日志到数据库. 新建一个spr ...
- Spring MVC通过AOP切面编程 来拦截controller 实现日志的写入
首选需要参考的是:[参考]http://www.cnblogs.com/guokai870510826/p/5977948.html http://www.cnblogs.com/guokai8 ...
- spring MVC controller中的方法跳转到另外controller中的某个method的方法
1. 需求背景 需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示. 本来以为挺简单的一 ...
- 反射找Controller中的方法
/// <summary> /// 根据接口编码APICode,调用相应的webapi方法,注意返回值是json字符串 /// </summary> /// <param ...
- unity3D 中的C#脚本一个类调用另一类中简单方法
案例展示 SubMenuManage类中的实例化代码如下: static SubMenuManage sub_this; public static SubMenuManage Instance() ...
- angularjs 外部调用controller中的方法
angular.element(document.querySelector('[ng-controller=mainCtrl]')).scope().viewGo('tab.VIPPay_Succe ...
随机推荐
- 洛谷 P3237 [HNOI2014]米特运输 解题报告
P3237 [HNOI2014]米特运输 题目描述 米特是\(D\)星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题. \(D\)星上有 ...
- [SDOI2016]储能表——数位DP
挺隐蔽的数位DP.少见 其实减到0不减了挺难处理.....然后就懵了. 其实换个思路: xor小于k的哪些都没了, 只要留下(i^j)大于等于k的那些数的和以及个数, 和-个数*k就是答案 数位DP即 ...
- python并发编程之IO模型 (四十九)
IO模型介绍 http://www.cnblogs.com/linhaifeng/articles/7454717.html
- selectionStart和selectionEnd属性
在网上看了很多用js在光标处插入文字的代码,很多都没有用,互抄而已,浪费时间.最近用到一个新方法,可以到达这个需求.IE支持document.selection,Firefox,Chrome,Safa ...
- jQuery中json中关于带有html代码网页的处理
昨天在使用jQuery的get方式请求返回json格式数据.然后使用jQuery自带的parseJSON 处理.总是出现这样的错误. 如果返回数据中content改成普通的数据可以通过.找了半天错误, ...
- springmvc 中@Controller和@RestController的区别
@Controller和@RestController的区别? 官方文档:@RestController is a stereotype annotation that combines @Respo ...
- H3C交换机端口安全技术之端口隔离的应用
H3C交换机端口安全技术---端口隔离的应用 相信大家所在公司都会有财务部门,普通员工和领导,网络工程师在配置的时候为了安全考虑,会用一些硬件上自身支持的功能区做一些安全措施.为了方便说明需求,我特意 ...
- 超详细设置Idea类注释模板和方法注释模板
网上找了一下,没有很详细且正确介绍Idea配置注释模板的,于是结合多篇文章自己琢磨整理出如下. 设置类注释模板 1.选择File–>Settings–>Editor–>File an ...
- SQL 对大小写不敏感!
一定要记住,SQL 对大小写不敏感!
- python学习笔记8-异常处理
一.异常处理 在程序运行过程中,总会遇到各种各样的错误.程序一出错就停止运行了,那我们不能让程序停止运行吧,这时候就需要捕捉异常了,通过捕捉到的异常,我们再去做对应的处理. 下面我们先写一个函数,实现 ...