「本文已参加好文召集令活动,点击检查:后端、大前端双赛道投稿,2万元奖池等你挑战!」

SpringbootAOP 失效的原因

今日 4ye 来和小伙伴们同享一个小实战啦 ,冲冲冲~ (。・∀・)ノ

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

实战回忆

(我竟然拖到现在才写了这文章…… )approach

主要是在一个周日(2020.6.6)在技能群里看到一个老哥在问

“怎样用切面来捕获自界说异常?” ( ̄▽ ̄)”

我其时想的是,捕获异常不是很常见的吗,平Git常常常用到这个大局异常捕获 ,所以就把自己 GitHub 上的小比如发给他(主要是这个 ControllerAdvice 注解),如图

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

作用老哥过了一段时分就加了我后端工程师主要做什么,还问我有没有空协助看下,还前端面试题想打电话问我,我当github中文官网网页时的心里是

这么急的吗(瑟瑟前端颤栗……)

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

不过刚好在外面没时间,就婉拒了,后来晚上回来,愣是花了两个钟,才看懂 为啥这个AOP 没有收效?为啥没能捕获到异常?

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

下面进入主题(项目全体介绍

maven项目github永久回家地址结构图

在该项目中,maven项目选用多模块构建父子结构,由 父maven 来一致管理这前端开发需求学什么些公共包,以及项目的全体版别特github永久回家地址色装备等

里面有两个gitee模块,starter 模块和 core 模块,其间 startegitlabr 模块依靠 core 模块,全体如下图

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

子模块介绍

不知道小伙伴们看到上面的 starter 有没有嗅到什么 ?

一开始我以为是常见的前端和后端的差异 自界说starter ,可是里面的内容却和我想的github下载有点收支,竟然只需一个 spring.factories 文件, 很显着这儿运用到了 Springboot 的 SPI 机制

这个在我们之前的 Springboot主动设备原理探求前端学什么 一文中有介绍到,小伙伴们能够前去了解看看~

对两个模块中的核心部后端是做什么的github是干什么的进行打开,结构如下

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

core项目描绘后端言语非web项目里面只需 service ,没有发动类等

因为 core 模块 不是github直播渠道永久回家web项目!!,所以这个 ControllerAdvice 是必定不能用的,毕竟它是在 web 包中的,一般我们在 web项目中合作这个@ExceptionHandler(Exception.class) 结束大局异常捕获,然后进行一致处理的。

Springboot 的 SPI 机制 中我们能够得知,Springboot 项目发动时,会去扫描各个项目中的 META-INF/spring.factories 文件(包括各个jar包),然后将其间的装备信息读取到内存中,而主动装备时会依据必定的条件对这些类进appstore行选择,毕竟创立契合的类,结束这个主动设备。

很显着,这儿便是经过主动装备,来结束相关 bean 的注入。

装备类说明

那么,在gitee了解了这些基本信息后,我们能够把目光移到这GitxxxConfig 上,这儿模仿了一个

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

紧接着便是项目中的切面装备了,例如曾经写的小比如:

代码在我的 GitHub

github.com/RyzeYang/sp…

经过appstore常告诉来捕获

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

除了上面这两个之外,项目中没有用到其他装备了!

问题来了

这个时分问题就来了,在界说了切面之后,发现底子没有在项目中起作用!而其他都能够正常运转!

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

所以我一贯在想,这是为啥呀,清楚切面现已界说好了呀……

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

总算,我开始了尝试,在 yaml 装备文件中增加这个参数

spring:
aop:
auto: true

因为在印象中,这个默许是 true ,会默许git教程运用这个 @github官网EnableAspectJAutoProxy , 不必我们手动去增加这个 @EnableAspectJAutoProxy 注解(之前一贯没有手动增加这个github永久回家地址注解)

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

作用也没什么后端开发作用……

所以乎,我决定手动增加到前端技能刚刚那个appear xxxConfig 装备类上,效后端开发需求学什么果也没有什么作用approach……

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

总算,我才想起那个 切面配app是什么意思 没有被加载到这个 Spring 中 ,所以我又在那个github装备类 xxxConfig 上增加了这个包扫描注解 @ComponentScan(basePackages = "com.xxx.xxx")

作用总算成功了!

所以我赶在 23:59gitlab 将修改后的文件发给那位老哥后,却发现他竟然睡着了 哈哈哈

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

问题分析

处理问题后,我们能够发现这个问题就下面后端是做什么的两点

  1. 没有将切面注册到 SpringIOC 容器中
  2. 没有运用这个 @EnableAspectJAutoProxy

第一步的处理也很简单,Git便是没有装备这个包扫描 @ComponentScan(basePackages = "cgithub永久回家地址om.xxx.xxx")

第二步的处理嘛,就有点一头雾水了其时,毕竟之前也不需求我手动去增加的,而且从装备的描绘信息中github中文官网网页能够发现,即便我们没有装备,他也是默许打开的,会自app是什么意思动运用这个注解的~

那么小Git伙伴们知道apple第二步问题的所在吗

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

嘿嘿,答案就出在这个主动装备 身上,能够发现我们上面都没有运用到这个 @EnableAutoConfig后端是做什么的uration 注解,而在我们的 SpringBootapp是什么意思Application 组合注解中,最重要的便是它了! 经过它去打开了我们的这个主动前端框架设备

这个时分又得把这文章搬出来了 Springboot主动设备原理探求 哈哈

那么我们再来看看这个 AOP主动设备的装备类

AOP主动设备的装备类

AopAu后端言语toConfiguration 源码如下

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

开头有这么一个条前端学什么件注解

@ConditionalOnProperty(prefix = "spring.aop"gitee, name = "auto", havingValuegithub中文官网网页 = "true后端是做什么的", matcAPPhIfMissing = true)

havingValue = "t前端开发rue" 的意思是:值为 true 时才apple有效

matchIfMissing = true 的意思是:没有装备这个特征时也能加载

接着让咱giti们把目光移到第一个静态内部类: AspectJAutoProxyingConfiguration

如图:

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

这个我们也比较了解啦, proxyTargetClasstrue 时标明运用 cglibfalse 运用 JDK动态署理

接着看毕竟的静态内部类: ClassProxyingConfiguration

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

能够发现它github直播渠道永久回家这儿的条件是和 AspectJAutoPrappstoreoxyingConfiguration 相反的,当没有这个 Advice 类时,帮我们去注册这个署理到 IOC

看完该AOP主动设备类后, 我们可giti以发现当我们运用 @EnableAutoConfiguration 主动设备注解时并引进 AOP 的包时,它会主动帮我们设备这个AopAutoConfiguration ,而它里面就运用到了 @EnableAspectJAutoProxy ,所以我们一般不必手动增加该注解。

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

怎样查验

嘿嘿,再出一个小问题考考小伙伴

前端和后端的差异没有细心的小伙伴发现上面的 core 模块是没有用到这个 SpringBootApplication 的,而且我们也没有用到这个 @EnableAutogit教程Configuration ,那么没有主动设备,这个 SPI 显着也没啥作用 ,Git那么,咱github中文官网网页们在项目中要怎样查验呢~

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

答案就在 单元查验的注解身上 @SpringBootTest(classes = xxxConfigu后端开发ration.class)

经过这个 classes ,我们直接指定并实例化这个装备类就能够了

我也是报错了才知道 哈哈

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

总结

嘿嘿,老规矩前端工程师,画个图总结下啦

排查思路

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

知识脑图

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

那么,本期就后端是做什么的同享到这啦,喜欢的前端技能小伙伴记住点点赞呀~ 下期看看状况同享下下面某一个叭

  • Springboot自界说starter
  • 运用AOP结束插件
  • Spring源码

花了2个钟才搞懂这AOP为啥没收效,水友却睡着了……

毕竟

欢迎小伙伴们来一起探讨问题Git~

假如你觉得本篇文章还不错的APP话,那托付再点点赞支撑一下前端工程师

让我们开始这一场意外的相遇吧!appstore~

欢迎留言!谢谢支撑!ヾ(≧▽≦*)o 冲冲冲!!

我是4ye 我们下期应该……application很快再见!!