Spring MVC AOP切面失效原因与处理
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切面失效原因与处理相关推荐
- spring扫描linux上问题,Spring MVC 自动扫描注解失效原因
关于spring自动扫描,在控制层,采用注解配置@Controller,项目能够成功启动,且无任何报错.但是 在进行页面跳转时,并未进行相应的拦截,整个界面只能在默认界面 ,跳转报404,由于楼主初次 ...
- spring AOP注解失效原因
目录 @Transactional @Async等注解不起作用 JDK动态代理 Spring AOP注解失效原因及解决 原因1:同一个类中,方法A调用方法B(方法B上加有注解),注解无效 原因2:AO ...
- Spring MVC Aop注入遇到空指针bug
目录 过滤 bug描述 源码 问题分析 改进的代码 过滤 如果是配置增强后报空指针,而且没有使用Around的方式,有可能有以下几种情况: Controller层的调用service层时的方法为p ...
- java动态菜单显示实现,java – 为Spring MVC / AOP应用程序实现动态菜单
我希望为我的 Spring MVC应用程序实现动态可更改的菜单(无论何时添加带注释的方法或控制器). 我想要的是引入新的注释(@RequestMenuMapping),它将转到@Controller ...
- spring之AOP切面不生效!!!!!原因在这
首先配置好切面代码 打印日志 package com.rfca.aop;import com.fasterxml.jackson.databind.ObjectMapper; import org.a ...
- Spring中AOP切面编程学习笔记
注解方式实现aop我们主要分为如下几个步骤: 1.在切面类(为切点服务的类)前用@Aspect注释修饰,声明为一个切面类. 2.用@Pointcut注释声明一个切点,目的是为了告诉切面,谁是它的服务对 ...
- [原创]java WEB学习笔记107:Spring学习---AOP切面的优先级,重用切点表达式
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring自定义AOP切面
切面 切面需要实现PointcutAdvisor接口,包含切点和通知. package com.morris.spring.aop;import org.aopalliance.aop.Advice; ...
- Spring的AOP切面编程
语言苍白无力,我们直接代码说话 package com.example.demo.aspect; import org.springframework.stereotype.Component; @C ...
最新文章
- pip镜像源永久设置成国内镜像源,提升下载速度
- 【完结】12大深度学习开源框架(caffe,tf,pytorch,mxnet等)快速入门项目
- python获取指定目录下所有文件名os.walk和os.listdir
- 三星手机Android9和10的区别,三星Galaxy S10+ VS 小米9 拍照深度对比评测:神仙打架...
- 【MySQL distinct的使用】如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中
- Java调用.net开发的webService接口
- 天梯—个位数统计(C语言)
- 微信小程序开发基础知识总结
- 第五天:在博客路由中使用登录验证,配置 nginx解决前后端跨域
- mysql5.7.22.zip使用,mysql5.7.22 zip 版安装
- 从官方例程深度学习海思SDK及API(2)
- Android8.0 Fingerprint指纹启动流程详细分析
- (CVPR 2020) RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds
- 运营15年的飞扬军事论坛宣布停止运营 关闭服务器
- 云计算的特点,主要有哪些?
- 【AI学习笔记】退出 Anaconda 虚拟环境时 遇到的两种报错。
- 英雄联盟萌萌哒小锤子波比台词
- 3. Kubernetes资源-概述
- adb shell getprop/setprop
- 秋季天凉易感冒 冷水洗脸来预防