花了 2 个钟才搞懂这 AOP 为啥没生效,水友却睡着了……
lipiwang 2024-11-13 13:39 40 浏览 0 评论
Springboot中 AOP失效的原因
今天 4ye 来和小伙伴们分享一个小实战啦 ,冲冲冲~ (。???)ノ
实战回顾
(我居然拖到现在才写了这文章…… )
主要是在一个周日(2021.6.6)在技术群里看到一个老哥在问
“怎么用切面来捕获自定义异常?” ( ̄▽ ̄)"
我当时想的是,捕获异常不是很常见的吗,平时经常用到这个全局异常捕获 ,于是就把自己 GitHub 上的小例子发给他(主要是这个 ControllerAdvice 注解),如图
结果老哥过了一段时候就加了我,还问我有没有空帮忙看下,还想打电话问我,我当时的内心是
这么急的吗(瑟瑟发抖……)
不过刚好在外面没时间,就婉拒了,后来晚上回来,愣是花了两个钟,才看懂 为啥这个AOP 没有生效?为啥没能捕获到异常?
下面进入主题(项目整体介绍)
maven项目结构图
在该项目中,maven项目采用多模块构建,父子结构,由 父maven 来统一管理这些公共包,以及项目的整体版本属性配置等
里面有两个模块,starter 模块和 core 模块,其中 starter 模块依赖 core 模块,整体如下图
子模块介绍
不知道小伙伴们看到上面的 starter 有没有嗅到什么 ?
一开始我以为是常见的 自定义starter ,但是里面的内容却和我想的有点出入,居然只有一个 spring.factories 文件, 很明显这里使用到了 Springboot 的 SPI 机制。
这个在我们之前的 Springboot自动装配原理探索 一文中有介绍到,小伙伴们可以前去了解看看~
对两个模块中的核心部分进行展开,结构如下
core项目描述:非web项目里面只有 service ,没有启动类等
由于 core 模块 不是web项目!!,所以这个 ControllerAdvice 是肯定不能用的,毕竟它是在 web 包中的,一般我们在 web项目中配合这个@ExceptionHandler(Exception.class) 实现全局异常捕获,然后进行统一处理的。
从 Springboot 的 SPI 机制 中我们可以得知,Springboot 项目启动时,会去扫描各个项目中的 META-INF/spring.factories 文件(包括各个jar包),然后将其中的配置信息读取到内存中,而自动配置时会根据一定的条件对这些类进行筛选,最后创建符合的类,完成这个自动装配。
很明显,这里就是通过自动配置,来实现相关 bean 的注入。
配置类说明
那么,在了解了这些基本信息后,我们可以把目光移到这个 xxxConfig 上,这里模仿了一个
紧接着就是项目中的切面配置了,例如以前写的小例子:
代码在我的 GitHub :
https://github.com/RyzeYang/springboot-demo-4ye.git
通过异常通知来捕获
除了上面这两个之外,项目中没有用到其他配置了!
问题来了
这个时候问题就来了,在定义了切面之后,发现根本没有在项目中起作用!而其他都可以正常运行!
于是我一直在想,这是为啥呀,明明切面已经定义好了呀……
终于,我开始了尝试,在 yaml 配置文件中添加这个参数
spring:
aop:
auto: true
因为在印象中,这个默认是 true ,会默认使用这个 @EnableAspectJAutoProxy , 不用我们手动去添加这个 @EnableAspectJAutoProxy 注解(之前一直没有手动添加这个注解)
结果也没什么效果……
于是乎,我决定手动添加到刚刚那个 xxxConfig 配置类上,结果也没有什么作用……
终于,我才想起那个 切面配置 没有被加载到这个 Spring 中 ,于是我又在那个配置类 xxxConfig 上添加了这个包扫描注解 @ComponentScan(basePackages = "com.xxx.xxx")
结果终于成功了!
于是我赶在 23:59 将修改后的文件发给那位老哥后,却发现他居然睡着了 哈哈哈
问题剖析
解决问题后,我们可以发现这个问题就下面两点
- 没有将切面注册到 SpringIOC 容器中
- 没有使用这个 @EnableAspectJAutoProxy
第一步的解决也很简单,就是没有配置这个包扫描 @ComponentScan(basePackages = "com.xxx.xxx")
第二步的解决嘛,就有点一头雾水了当时,毕竟之前也不需要我手动去添加的,而且从配置的描述信息中可以发现,即使我们没有配置,他也是默认开启的,会自动使用这个注解的~
那么小伙伴们知道第二步问题的所在吗
嘿嘿,答案就出在这个自动配置 身上,可以发现我们上面都没有使用到这个 @EnableAutoConfiguration 注解,而在我们的 SpringBootApplication 组合注解中,最重要的就是它了! 通过它去开启了我们的这个自动装配。
这个时候又得把这文章搬出来了 Springboot自动装配原理探索 哈哈
那么我们再来看看这个 AOP自动装配的配置类
AOP自动装配的配置类
AopAutoConfiguration 源码如下
开头有这么一个条件注解
@ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)
havingValue = "true" 的意思是:值为 true 时才有效
matchIfMissing = true 的意思是:没有配置这个属性时也能加载
接着让我们把目光移到第一个静态内部类: AspectJAutoProxyingConfiguration
如图:
这个我们也比较熟悉啦, proxyTargetClass 为 true 时表示使用 cglib ,false 使用 JDK动态代理
接着看最后的静态内部类: ClassProxyingConfiguration
可以发现它这里的条件是和 AspectJAutoProxyingConfiguration 相反的,当没有这个 Advice 类时,帮我们去注册这个代理到 IOC 中
看完该AOP自动装配类后, 我们可以发现当我们使用 @EnableAutoConfiguration 自动装配注解时并引入 AOP 的包时,它会自动帮我们装配这个AopAutoConfiguration ,而它里面就使用到了 @EnableAspectJAutoProxy ,所以我们一般不用手动添加该注解。
怎么测试
嘿嘿,再出一个小问题考考小伙伴
有没有细心的小伙伴发现上面的 core 模块是没有用到这个 SpringBootApplication 的,而且我们也没有用到这个 @EnableAutoConfiguration ,那么没有自动装配,这个 SPI 显然也没啥作用 ,那么,我们在项目中要怎么测试呢~
答案就在 单元测试的注解身上 @SpringBootTest(classes = xxxConfiguration.class)
通过这个 classes ,我们直接指定并实例化这个配置类就可以了
我也是报错了才知道 哈哈
总结
嘿嘿,老规矩,画个图总结下啦
排查思路
知识脑图
那么,本期就分享到这啦,喜欢的小伙伴记得点点赞呀~ 下期看看情况分享下下面某一个叭
- Springboot自定义starter
- 利用AOP实现插件
- Spring源码
最后
欢迎小伙伴们来一起探讨问题~
如果你觉得本篇文章还不错的话,那拜托再点点赞支持一下呀
让我们开始这一场意外的相遇吧!~
欢迎留言!谢谢支持!ヾ(≧▽≦*)o 冲冲冲!!
我是4ye 咱们下期应该……很快再见!!
喜欢的话可以关注下 头条号 和 公众号 Java4ye 支持下 4ye 呀
相关推荐
- 微软Office Open XML中的数字签名漏洞
-
MicrosoftOffice是最广泛使用的办公文档应用程序之一。对于重要文件,如合同和发票,可以对其内容进行签名,以确保其真实性和完整性。自2019年以来,安全研究人员发现了针对PDF和ODF等其...
- Javaweb知识 day12 XML(javaweb中xml作用)
-
一、XML:1.1概念:ExtensibleMarkupLanguage可扩展标记语言*可扩展:标签都是自定义的。<user><student>1.2功能:...
- 易筋洗髓功——内外同修方可致远(易筋洗髓功口诀)
-
达摩祖师所传易筋、洗髓两经,一分为二,二实为一,无非以方便法门接引众生,而归于慈悲清净之心地。修炼《易筋经》是为强身健体,修炼《洗髓经》是为修心养性,此二者相辅相成,内外兼修,缺一不可。这是一套传统中...
- 道家洗髓功修炼要义,洗髓功如何做到丹田聚气?
-
不管是道家洗髓功,还是洗髓经,其修炼的关键点就在于得气、行气、聚气...那么,作为洗髓功修炼者,具体该怎么做呢?在实际修炼中,就洗髓功的修炼方法来讲,我们可以简单的归纳为修炼三部曲,其具体表现如下:一...
- 「清风聊练功」师门传我易筋经:聊聊我的学习经历和正身图感受
-
一个人的眼界认识,是随着是自身的知识积累和水平不断成长的。开篇为什么要说这么一句呢?是从我的学习经历上感受明显的这句话:一处不到一处迷。我们学传统武术,内功功法,也是从小白到明白一步步走的,走的越远,...
- 内功外练功介绍(练内功 外功)
-
这里介绍我练习的两套动功心得体会。是老道长的八部金刚功、长寿功和增演易筋洗髓经。八部金刚功外练奇经八脉,练出健康强壮的好身体还是可以的,长寿功也是内练功法。这部功法很好的预防效果。这个大家都认同的。说...
- 《增演易筋洗髓内功图说》17卷(1930年(清)周述官撰 1
-
少林空悟老师珍藏
- 国术典籍:《增演易筋洗髓内功图说》【2024年8月编校】
-
《增演易筋洗髓内功图说》系养生气功著作,全书共十八卷。清周述官编撰于光绪二十一年(1895年)。清光绪十九年(1893年),僧人静一空悟将少林功法传授于周述官,并将《增益易筋洗髓内功图说》十二卷(按,...
- 小说:自媒体小白的修道之路-洗髓(自媒体小白运营技巧)
-
谁应了谁的劫,谁又变成了谁的执念。当沧海遗忘了桑田,这世间又多了一个不回家的人!异域空间中,知生缓缓起身,目光扫了一下小帝后,又转身看向画板上的那朵白色蒲公英,自言道:“白瑛,这一世我们莫要再辜负了!...
- 这才是少林洗髓经真相:它是静功和导引术与八段锦暗合
-
不少朋友误解易筋经和洗髓经,将其简单归为强力呼吸的吐纳功以及为了提升房中的关窍功。事实上易筋经和洗髓经是两部功法:易筋经主要为炼体,包含以膜论为核心的十二月怕打筋膜法,以及辅助的呼吸、导引功法;洗髓经...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)