想使用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的自动扫描配置

  1. 代码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中的方法相关推荐

  1. 框架:Spring Aop、拦截器、过滤器的区别

    Spring Aop.拦截器.过滤器的区别 Filter过滤器:拦截web访问的url地址. Interceptor拦截器:拦截以.action结尾的url,拦截Action的访问. Spring A ...

  2. Spring AOP与拦截器的区别

    2019独角兽企业重金招聘Python工程师标准>>> 1. 作用层面     拦截器只对action负责,作用层面一般位于Controller层     Spring AOP主要是 ...

  3. springMVC 不扫描 controller 中的方法

    最近把之前的一个Maven项目在一个新的电脑环境上导入Eclipse,启动时却发现不扫描 controller 中的方法 下面是正确的 spring-mvc.xml 文件 <?xml versi ...

  4. Spring AOP无法拦截内部方法调用-- expose-proxy=true用法

    假设一个接口里面有两个方法: package demo.long;public interface CustomerService { public void doSomething1(); publ ...

  5. controller调用另一个controller中的方法 获取返回值_必须掌握!你知道 Spring 中运用的 9 种设计模式吗 ?...

    Spring中涉及的设计模式总结,在面试中也会经常问道 Spring 中设计模式的问题.本文以实现方式.实质.实现原理的结构简单介绍 Sping 中应用的 9 种设计模型,具体详细的刨析会在后面的文章 ...

  6. 日志管理(spring AOP切面拦截)

    **最近,在写日志管理的东西呢,用了几种方法试,还是拦截比较好用,直接截下来传入到数据库中存储. 写的时候,真是头疼啊. 哦~对了,忘了说了,不需要用到Dao层哦. 首先,来一个POJO实体类吧,我看 ...

  7. Java程序员必会的Spring AOP在实际项目中的应用

    很久没有用过Java的AOP,最近接触到了一个需求,恰好可以用AOP的思想来实现,就此总结一下. 目录 AOP简介 ① pointcut(切入点) ② advice(通知) ③ aspect(切面) ...

  8. Spring AOP及其在SpringBoot中的使用

    一.前言 本文简单介绍了Spring Aop的思想,以及部分基础概念,并且附带两个SpringBoot中简单的实例. 本文章中使用的环境及版本: 开发工具:Intellij IDEA 2017.3.4 ...

  9. spring---aop(3)---Spring AOP的拦截器链

    写在前面 时间断断续续,这次写一点关于spring aop拦截器链的记载.至于如何获取spring的拦截器,前一篇博客已经写的很清楚(spring---aop(2)---Spring AOP的JDK动 ...

  10. Spring AOP MethodInvocation拦截器调用原理

    Spring AOP源码目录 Spring AOP总览:灵魂画手图解Spring AOP实现原理 Spring AOP源码01:Jdk动态代理底层源码 Spring AOP源码02:ProxyFact ...

最新文章

  1. 洛谷U4807抽水机[最小生成树]
  2. Linux shell if判断=左右必须要有空格
  3. 客户端页面不更新CSS样式或JS脚本的方法 (2018-08-17 17:33)
  4. Vs工程高版本向低版本迁移
  5. CNKI学术趋势与万方数据的知识脉络
  6. 刷榜中ASO优化中下载量与评论之间的对应比
  7. redis之SDS字符串,到底高效在哪里?(全面分析)
  8. 下方点击出项上方对应的插件_魔兽世界MiDKP3.0插件使用说明
  9. 英语3500词(七)dating主题(2022.1.19)
  10. 工业相机镜头选型实例及知识讲解
  11. 单倍型基因组组装方法
  12. 高中数学必修二立体几何中的向量方法(经典案例讲解)
  13. 五款手机APP黑科技,好用到爆炸
  14. 类的设计---麻球与油果
  15. 随笔小记-12.31
  16. Mysql 1607错误
  17. 网络工程师必备测试网络软件,网络工程师都知道的几款网络故障诊断工具
  18. EM(期望最大化)聚类算法详解
  19. 计算机儿歌音乐谱大全,简单乐谱儿歌有哪些?
  20. 2020ICPC·小米 网络选拔赛第一场 D.Router Mesh

热门文章

  1. “返回顶部”实现一例
  2. 正确使用SqlConnection对象,兼谈数据库连接池
  3. es 测试数据进行 增删查改
  4. Java Web提交任务到Spark Spark通过Java Web提交任务
  5. react-native 打离线包
  6. python中可迭代对象,迭代器,生成器的区别和联系
  7. 微软百名员工公开请愿,力挺“996.ICU”
  8. 我身边的那些有钱人。。
  9. StuQ Android 会员学习计划|帮你成为更优秀的 Android 工程师
  10. 史上最强Dubbo面试26题和答案:核心组件+服务治理+架构设计等