Spring MVC AOP切面失效原因与处理

  • 问题概述
  • AOP的两类实现
  • 解决方案
    • 方法一:用Autowired 注入自身的实例
    • 方法二:从Spring上下文获取增强后的实例引用
    • 方法三: 利用AopContext

问题概述

背景是这样的:
1:直接调用service里面的AOP切面方法,那么就会触发切面的方法。
2:调用service的其他方法,间接的调用这个AOP切面方法,这个时候,就不会触发切面方法。
其他类似的场景:
A服务调用B服务提供的jar包中某个基于Spring注解的方法,往往基于@Resource这类注解的变量会是null,从而收获一个NPE。

AOP的两类实现

AOP的实现有二类,如果是基于接口的,会采用动态代理,生成一个代理类;如果是基于类的,会采用CGLib生成子类,然后在子类中扩展父类中的方法。

本文demo中的HelloService并不是一个接口,所以从上图的断点中可以看出,当Spring运行时,HelloService直接调用AOP方法时被增强为EnhancerBySpringCGLib。但是当以间接的方式调用anotherSayHi时

方法的调用方,是原始的HelloSerfvice实例,即:是未经过Spring AOP增强的对象实例。
所以解决问题的根源即为:间接调用时失去了cglib的身份信息。需要想办法用增强后的HelloService实例来调用!

解决方案

方法一:用Autowired 注入自身的实例

这个方法第一眼看上去感觉有些怪,自己注入自己,感觉有点象递归/死循环的搞法,但确实可以work,Spring在解决循环依赖上有自己的处理方式,避免了死循环。

方法二:从Spring上下文获取增强后的实例引用

原理与方法一其实类似,不多解释。

方法三: 利用AopContext

不过这个方法要注意的是,主类入口上,必须加上exporseProxy=true,参考下图:

最后来验证下这3种方法是否生效:

从运行结果上看,3种方法都可以解决这个问题。

参考

Spring MVC AOP切面失效原因与处理相关推荐

  1. spring扫描linux上问题,Spring MVC 自动扫描注解失效原因

    关于spring自动扫描,在控制层,采用注解配置@Controller,项目能够成功启动,且无任何报错.但是 在进行页面跳转时,并未进行相应的拦截,整个界面只能在默认界面 ,跳转报404,由于楼主初次 ...

  2. spring AOP注解失效原因

    目录 @Transactional @Async等注解不起作用 JDK动态代理 Spring AOP注解失效原因及解决 原因1:同一个类中,方法A调用方法B(方法B上加有注解),注解无效 原因2:AO ...

  3. Spring MVC Aop注入遇到空指针bug

    目录 过滤 bug描述 源码 问题分析 改进的代码 过滤   如果是配置增强后报空指针,而且没有使用Around的方式,有可能有以下几种情况: Controller层的调用service层时的方法为p ...

  4. java动态菜单显示实现,java – 为Spring MVC / AOP应用程序实现动态菜单

    我希望为我的 Spring MVC应用程序实现动态可更改的菜单(无论何时添加带注释的方法或控制器). 我想要的是引入新的注释(@RequestMenuMapping),它将转到@Controller ...

  5. spring之AOP切面不生效!!!!!原因在这

    首先配置好切面代码 打印日志 package com.rfca.aop;import com.fasterxml.jackson.databind.ObjectMapper; import org.a ...

  6. Spring中AOP切面编程学习笔记

    注解方式实现aop我们主要分为如下几个步骤: 1.在切面类(为切点服务的类)前用@Aspect注释修饰,声明为一个切面类. 2.用@Pointcut注释声明一个切点,目的是为了告诉切面,谁是它的服务对 ...

  7. [原创]java WEB学习笔记107:Spring学习---AOP切面的优先级,重用切点表达式

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. Spring自定义AOP切面

    切面 切面需要实现PointcutAdvisor接口,包含切点和通知. package com.morris.spring.aop;import org.aopalliance.aop.Advice; ...

  9. Spring的AOP切面编程

    语言苍白无力,我们直接代码说话 package com.example.demo.aspect; import org.springframework.stereotype.Component; @C ...

最新文章

  1. pip镜像源永久设置成国内镜像源,提升下载速度
  2. 【完结】12大深度学习开源框架(caffe,tf,pytorch,mxnet等)快速入门项目
  3. python获取指定目录下所有文件名os.walk和os.listdir
  4. 三星手机Android9和10的区别,三星Galaxy S10+ VS 小米9 拍照深度对比评测:神仙打架...
  5. 【MySQL distinct的使用】如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中
  6. Java调用.net开发的webService接口
  7. 天梯—个位数统计(C语言)
  8. 微信小程序开发基础知识总结
  9. 第五天:在博客路由中使用登录验证,配置 nginx解决前后端跨域
  10. mysql5.7.22.zip使用,mysql5.7.22 zip 版安装
  11. 从官方例程深度学习海思SDK及API(2)
  12. Android8.0 Fingerprint指纹启动流程详细分析
  13. (CVPR 2020) RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds
  14. 运营15年的飞扬军事论坛宣布停止运营 关闭服务器
  15. 云计算的特点,主要有哪些?
  16. 【AI学习笔记】退出 Anaconda 虚拟环境时 遇到的两种报错。
  17. 英雄联盟萌萌哒小锤子波比台词
  18. 3. Kubernetes资源-概述
  19. adb shell getprop/setprop
  20. 秋季天凉易感冒 冷水洗脸来预防

热门文章

  1. GetContactInfoUtils(一个获取手机联系人名称,电话,头像的工具类)
  2. Xilinx-7系列FPGA架构—— CLB
  3. C# WPF窗体+WCF实现五子棋
  4. 十几套JavaWeb项目,拿去当毕业设计简直太爽了(源码)
  5. 课程设计:学生成绩管理系统
  6. 福建省谷歌卫星地图下载
  7. 云计算 linux运维工程师招聘,linux云计算运维工程师前景及薪资待遇
  8. QQ2005beta3新功能图片抢先看!(转)
  9. 企业为什么要通过直播来做营销呢?
  10. 第三人称计算机获奖感言,求一篇获奖感言,加分到300