Spring AOP无法拦截Controller中的方法
想使用AOP Annotation配置Spring MVC的Controller进行拦截, 发现无法拦截Controller的方法, 却可以拦截Service层的方法.
一开始:
Spring的配置文件application.xml包含了 开启AOP自动代理,Service扫描配置,以及Aspect的自动扫描配置
代码1:application.xml<aop:aspectj-autoproxy/><context:component-scan base-package="com.example.sdk.service"> <context:component-scan base-package="com.hodc.sdk.aspect"/>
Spring MVC的配置文件spring-mvc.xml主要内容是Controller层的自动扫描配置.
代码2:spring-mvc.xml<context:component-scan base-package="com.hodc.sdk.controller" />
增强代码为如下:
代码3全限定名:com.example.sdk.aspect.ControllerAspect@Component @Aspect public class ControllerAspect {@Around(value = "execution(* com.hodc.sdk.controller.json.hadoop.HadoopClusterManage.*JsonWithException(..))") //1// @Around(value = "within(@org.springframework.stereotype.Controller *)") //2// @Around(value = "execution(* org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(..))") //3public Object test(ProceedingJoinPoint joint) {Result result = new Result();System.out.println("in aspect");result = (Result) joint.proceed();return result;}
需要被拦截的方法如下:
代码4全限定名: com.example.sdk.controller.HadoopClusterManage#listVirtualHiveDBSJsonWithException@RequestMapping(value = "listVirtualHiveDBS.do", produces = "application/json")public@ResponseBodyResult listVirtualHiveDBSJsonWithException(@RequestParam("clusterId") int clusterId) {Result result = new Result();List<Db> dbs = syncServiceForWeb.listVirtualHiveDBS(clusterId);result.setData(dbs);return result;}
发现这样配置并没有用, 这个方法无法被拦截, 参照网上搜索的结果, 将@Around的PointCut改成代码3中2,3写法也没有作用.
参照http://stackoverflow.com/questions/17834958/spring-aop-is-not-working-in-with-mvc-structure?rq=1
因为Spring的Bean扫描和Spring-MVC的Bean扫描是分开的, 两者的Bean位于两个不同的Application, 而且Spring-MVC的Bean扫描要早于Spring的Bean扫描, 所以当Controller Bean生成完成后, 再执行Spring的Bean扫描,Spring会发现要被AOP代理的Controller Bean已经在容器中存在, 配置AOP就无效了.
同样这样的情况也存在于数据库事务中, 如果Service的Bean扫描配置在spring-mvc.xml中, 而数据库事务管理器配置在application.xml中, 会导致数据库事务失效, 原理一样.
所以这里 ,我们需要把AOP放置在Controller扫描配置的文件中.
Spring的配置文件application.xml包含了 开启AOP自动代理,Service扫描配置, 现在只包含了service的自动扫描配置
代码5:application.xml<context:component-scan base-package="com.example.sdk.service">
Spring MVC的配置文件spring-mvc.xml主要内容是Controller层的自动扫描配置,添加了开启AOP自动代理,以及Aspect的自动扫描配置
代码6:spring-mvc.xml <aop:aspectj-autoproxy/> <context:component-scan base-package="com.hodc.sdk.aspect"/> <context:component-scan base-package="com.hodc.sdk.controller" />
这样配置情况下代码3的3种pointcut都是有效的,但是第一种是最精确的.
转载于:https://www.cnblogs.com/Frank-Hao/p/5787813.html
Spring AOP无法拦截Controller中的方法相关推荐
- 框架:Spring Aop、拦截器、过滤器的区别
Spring Aop.拦截器.过滤器的区别 Filter过滤器:拦截web访问的url地址. Interceptor拦截器:拦截以.action结尾的url,拦截Action的访问. Spring A ...
- Spring AOP与拦截器的区别
2019独角兽企业重金招聘Python工程师标准>>> 1. 作用层面 拦截器只对action负责,作用层面一般位于Controller层 Spring AOP主要是 ...
- springMVC 不扫描 controller 中的方法
最近把之前的一个Maven项目在一个新的电脑环境上导入Eclipse,启动时却发现不扫描 controller 中的方法 下面是正确的 spring-mvc.xml 文件 <?xml versi ...
- Spring AOP无法拦截内部方法调用-- expose-proxy=true用法
假设一个接口里面有两个方法: package demo.long;public interface CustomerService { public void doSomething1(); publ ...
- controller调用另一个controller中的方法 获取返回值_必须掌握!你知道 Spring 中运用的 9 种设计模式吗 ?...
Spring中涉及的设计模式总结,在面试中也会经常问道 Spring 中设计模式的问题.本文以实现方式.实质.实现原理的结构简单介绍 Sping 中应用的 9 种设计模型,具体详细的刨析会在后面的文章 ...
- 日志管理(spring AOP切面拦截)
**最近,在写日志管理的东西呢,用了几种方法试,还是拦截比较好用,直接截下来传入到数据库中存储. 写的时候,真是头疼啊. 哦~对了,忘了说了,不需要用到Dao层哦. 首先,来一个POJO实体类吧,我看 ...
- Java程序员必会的Spring AOP在实际项目中的应用
很久没有用过Java的AOP,最近接触到了一个需求,恰好可以用AOP的思想来实现,就此总结一下. 目录 AOP简介 ① pointcut(切入点) ② advice(通知) ③ aspect(切面) ...
- Spring AOP及其在SpringBoot中的使用
一.前言 本文简单介绍了Spring Aop的思想,以及部分基础概念,并且附带两个SpringBoot中简单的实例. 本文章中使用的环境及版本: 开发工具:Intellij IDEA 2017.3.4 ...
- spring---aop(3)---Spring AOP的拦截器链
写在前面 时间断断续续,这次写一点关于spring aop拦截器链的记载.至于如何获取spring的拦截器,前一篇博客已经写的很清楚(spring---aop(2)---Spring AOP的JDK动 ...
- Spring AOP MethodInvocation拦截器调用原理
Spring AOP源码目录 Spring AOP总览:灵魂画手图解Spring AOP实现原理 Spring AOP源码01:Jdk动态代理底层源码 Spring AOP源码02:ProxyFact ...
最新文章
- 洛谷U4807抽水机[最小生成树]
- Linux shell if判断=左右必须要有空格
- 客户端页面不更新CSS样式或JS脚本的方法 (2018-08-17 17:33)
- Vs工程高版本向低版本迁移
- CNKI学术趋势与万方数据的知识脉络
- 刷榜中ASO优化中下载量与评论之间的对应比
- redis之SDS字符串,到底高效在哪里?(全面分析)
- 下方点击出项上方对应的插件_魔兽世界MiDKP3.0插件使用说明
- 英语3500词(七)dating主题(2022.1.19)
- 工业相机镜头选型实例及知识讲解
- 单倍型基因组组装方法
- 高中数学必修二立体几何中的向量方法(经典案例讲解)
- 五款手机APP黑科技,好用到爆炸
- 类的设计---麻球与油果
- 随笔小记-12.31
- Mysql 1607错误
- 网络工程师必备测试网络软件,网络工程师都知道的几款网络故障诊断工具
- EM(期望最大化)聚类算法详解
- 计算机儿歌音乐谱大全,简单乐谱儿歌有哪些?
- 2020ICPC·小米 网络选拔赛第一场 D.Router Mesh
热门文章
- “返回顶部”实现一例
- 正确使用SqlConnection对象,兼谈数据库连接池
- es 测试数据进行 增删查改
- Java Web提交任务到Spark Spark通过Java Web提交任务
- react-native 打离线包
- python中可迭代对象,迭代器,生成器的区别和联系
- 微软百名员工公开请愿,力挺“996.ICU”
- 我身边的那些有钱人。。
- StuQ Android 会员学习计划|帮你成为更优秀的 Android 工程师
- 史上最强Dubbo面试26题和答案:核心组件+服务治理+架构设计等