「本文已参加好文召集令活动,点击检查:后端、大前端双赛道投稿,2万元奖池等你挑战!」
Springboot
中 AOP
失效的原因
今日 4ye 来和小伙伴们同享一个小实战啦 ,冲冲冲~ (。・∀・)ノ
实战回忆
(我竟然拖到现在才写了这文章…… )approach
主要是在一个周日(2020.6.6)在技能群里看到一个老哥在问
“怎样用切面来捕获自界说异常?” ( ̄▽ ̄)”
我其时想的是,捕获异常不是很常见的吗,平Git常常常用到这个大局异常捕获 ,所以就把自己 GitHub
上的小比如发给他(主要是这个 ControllerAdvice
注解),如图
作用老哥过了一段时分就加了我后端工程师主要做什么,还问我有没有空协助看下,还前端面试题想打电话问我,我当github中文官网网页时的心里是
这么急的吗(瑟瑟前端颤栗……)
不过刚好在外面没时间,就婉拒了,后来晚上回来,愣是花了两个钟,才看懂 为啥这个AOP
没有收效?为啥没能捕获到异常?
下面进入主题(项目全体介绍)
maven项目github永久回家地址结构图
在该项目中,maven项目选用多模块构建,父子结构,由 父maven 来一致管理这前端开发需求学什么些公共包,以及项目的全体版别特github永久回家地址色装备等
里面有两个gitee模块,starter
模块和 core
模块,其间 startegitlabr
模块依靠 core
模块,全体如下图
子模块介绍
不知道小伙伴们看到上面的 starter
有没有嗅到什么 ?
一开始我以为是常见的前端和后端的差异 自界说starter ,可是里面的内容却和我想的github下载有点收支,竟然只需一个 spring.factories
文件, 很显着这儿运用到了 Springboot 的 SPI 机制。
这个在我们之前的 Springboot主动设备原理探求前端学什么 一文中有介绍到,小伙伴们能够前去了解看看~
对两个模块中的核心部后端是做什么的分github是干什么的进行打开,结构如下
core项目描绘:后端言语非web项目里面只需 service
,没有发动类等
因为 core 模块 不是github直播渠道永久回家web项目!!,所以这个 ControllerAdvice
是必定不能用的,毕竟它是在 web
包中的,一般我们在 web项目中合作这个@ExceptionHandler(Exception.class)
结束大局异常捕获,然后进行一致处理的。
从 Springboot 的 SPI 机制 中我们能够得知,Springboot
项目发动时,会去扫描各个项目中的 META-INF/spring.factories
文件(包括各个jar包),然后将其间的装备信息读取到内存中,而主动装备时会依据必定的条件对这些类进appstore行选择,毕竟创立契合的类,结束这个主动设备。
很显着,这儿便是经过主动装备,来结束相关 bean
的注入。
装备类说明
那么,在gitee了解了这些基本信息后,我们能够把目光移到这Git个 xxxConfig
上,这儿模仿了一个
紧接着便是项目中的切面装备了,例如曾经写的小比如:
代码在我的 GitHub
:
github.com/RyzeYang/sp…
经过失appstore常告诉来捕获
除了上面这两个之外,项目中没有用到其他装备了!
问题来了
这个时分问题就来了,在界说了切面之后,发现底子没有在项目中起作用!而其他都能够正常运转!
所以我一贯在想,这是为啥呀,清楚切面现已界说好了呀……
总算,我开始了尝试,在 yaml
装备文件中增加这个参数
spring:
aop:
auto: true
因为在印象中,这个默许是 true
,会默许git教程运用这个 @github官网EnableAspectJAutoProxy
, 不必我们手动去增加这个 @EnableAspectJAutoProxy
注解(之前一贯没有手动增加这个github永久回家地址注解)
作用也没什么后端开发作用……
所以乎,我决定手动增加到前端技能刚刚那个appear xxxConfig
装备类上,效后端开发需求学什么果也没有什么作用approach……
总算,我才想起那个 切面配app是什么意思备 没有被加载到这个 Spring
中 ,所以我又在那个github装备类 xxxConfig
上增加了这个包扫描注解 @ComponentScan(basePackages = "com.xxx.xxx")
作用总算成功了!
所以我赶在 23:59gitlab 将修改后的文件发给那位老哥后,却发现他竟然睡着了 哈哈哈
问题分析
处理问题后,我们能够发现这个问题就下面后端是做什么的两点
- 没有将切面注册到
SpringIOC
容器中 - 没有运用这个
@EnableAspectJAutoProxy
第一步的处理也很简单,Git便是没有装备这个包扫描 @ComponentScan(basePackages = "cgithub永久回家地址om.xxx.xxx")
第二步的处理嘛,就有点一头雾水了其时,毕竟之前也不需求我手动去增加的,而且从装备的描绘信息中github中文官网网页能够发现,即便我们没有装备,他也是默许打开的,会自app是什么意思动运用这个注解的~
那么小Git伙伴们知道apple第二步问题的所在吗
嘿嘿,答案就出在这个主动装备 身上,能够发现我们上面都没有运用到这个 @EnableAutoConfig后端是做什么的uration
注解,而在我们的 SpringBootapp是什么意思Application
组合注解中,最重要的便是它了! 经过它去打开了我们的这个主动前端框架设备。
这个时分又得把这文章搬出来了 Springboot主动设备原理探求 哈哈
那么我们再来看看这个 AOP主动设备的装备类
AOP主动设备的装备类
AopAu后端言语toConfiguration
源码如下
开头有这么一个条前端学什么件注解
@ConditionalOnProperty(prefix = "spring.aop"gitee, name = "auto", havingValuegithub中文官网网页 = "true后端是做什么的", matcAPPhIfMissing = true)
havingValue = "t前端开发rue"
的意思是:值为 true
时才apple有效
matchIfMissing = true
的意思是:没有装备这个特征时也能加载
接着让咱giti们把目光移到第一个静态内部类: AspectJAutoProxyingConfiguration
如图:
这个我们也比较了解啦, proxyTargetClass
为 true
时标明运用 cglib
,false
运用 JDK
动态署理
接着看毕竟的静态内部类: ClassProxyingConfiguration
能够发现它github直播渠道永久回家这儿的条件是和 AspectJAutoPrappstoreoxyingConfiguration
相反的,当没有这个 Advice
类时,帮我们去注册这个署理到 IOC
中
看完该AOP主动设备类后, 我们可giti以发现当我们运用 @EnableAutoConfiguration
主动设备注解时并引进 AOP
的包时,它会主动帮我们设备这个AopAutoConfiguration
,而它里面就运用到了 @EnableAspectJAutoProxy
,所以我们一般不必手动增加该注解。
怎样查验
嘿嘿,再出一个小问题考考小伙伴
有前端和后端的差异没有细心的小伙伴发现上面的 core
模块是没有用到这个 SpringBootApplication
的,而且我们也没有用到这个 @EnableAutogit教程Configuration
,那么没有主动设备,这个 SPI
显着也没啥作用 ,Git那么,咱github中文官网网页们在项目中要怎样查验呢~
答案就在 单元查验的注解身上 @SpringBootTest(classes = xxxConfigu后端开发ration.class)
经过这个 classes
,我们直接指定并实例化这个装备类就能够了
我也是报错了才知道 哈哈
总结
嘿嘿,老规矩前端工程师,画个图总结下啦
排查思路
知识脑图
那么,本期就后端是做什么的同享到这啦,喜欢的前端技能小伙伴记住点点赞呀~ 下期看看状况同享下下面某一个叭
- Springboot自界说starter
- 运用AOP结束插件
- Spring源码
毕竟
欢迎小伙伴们来一起探讨问题Git~
假如你觉得本篇文章还不错的APP话,那托付再点点赞支撑一下前端工程师呀
让我们开始这一场意外的相遇吧!appstore~
欢迎留言!谢谢支撑!ヾ(≧▽≦*)o 冲冲冲!!
我是4ye 我们下期应该……application很快再见!!