花了2个钟,终于搞清楚 AOP 未生效的原因了,java工程师面试宝典

子模块介绍

不知道小伙伴们看到上面的 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 将修改后的文件发给那位老哥后,却发现他居然睡着了 哈哈哈

问题剖析

解决问题后,我们可以发现这个问题就下面两点???

  1. 没有将切面注册到 SpringIOC 容器中

  2. 没有使用这个 @EnableAspectJAutoProxy

第一步的解决也很简单,就是没有配置这个包扫描 @ComponentScan(basePackages = "com.xxx.xxx")

第二步的解决嘛,就有点一头雾水了当时,毕竟之前也不需要我手动去添加的,而且从配置的描述信息中可以发现,即使我们没有配置,他也是默认开启的,会自动使用这个注解的~

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

嘿嘿,答案就出在这个自动配置 身上,可以发现我们上面都没有使用到这个 @EnableAutoConfiguration 注解,而在我们的 SpringBootApplication 组合注解中,最重要的就是它了!通过它去开启了我们的这个自动装配

这个时候又得把这文章搬出来了 ??? Springboot自动装配原理探索 哈哈

那么我们再来看看这个 AOP自动装配的配置类

AOP自动装配的配置类

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

毕竟工作也这么久了 ,除了途虎一轮,也七七八八面试了不少大厂,像阿里、饿了么、美团、滴滴这些面试过程就不一一写在这篇文章上了。我会整理一份详细的面试过程及大家想知道的一些问题细节

美团面试经验

美团面试
字节面试经验
字节面试
菜鸟面试经验
菜鸟面试
蚂蚁金服面试经验
蚂蚁金服
唯品会面试经验
唯品会

因篇幅有限,图文无法详细发出
-1711877437212)]
字节面试经验
[外链图片转存中…(img-hBvd0fWh-1711877437213)]
菜鸟面试经验
[外链图片转存中…(img-aGusIyM7-1711877437213)]
蚂蚁金服面试经验
[外链图片转存中…(img-Zf7JY3Ao-1711877437214)]
唯品会面试经验
[外链图片转存中…(img-LKfwMRCn-1711877437214)]

因篇幅有限,图文无法详细发出

  • 29
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring AOP生效原因可能有以下几种情况。 首先,如果要增强的类或方法没有被Spring管理,那么AOP就无法生效。这种情况下,需要将目标类或方法注入到Spring容器中才能实现AOP的增强效果。 其次,如果要被增强的类或方法同时被Spring和Spring MVC扫描,可能会导致AOP失效。这是因为在Spring MVC容器中重新实例化的对象并没有被AOP代理,而是由Spring MVC容器直接管理。为了解决这个问题,我们需要确保AOP配置中的切点表达式声明与要切入的类和方法在同一个容器中。 另外,如果要增强的方法被同类的方法调用,也可能导致AOP不生效。这是因为AOP是在目标方法调用时才会生效,而同类的方法调用不会触发AOP。要解决这个问题,可以将目标方法抽取为单独的方法,然后在原来的方法和其他使用该方法的地方进行调用。 还有一种情况是,如果使用了注解方式进行AOP,但没有开启注解支持,也会导致AOP不生效。要解决这个问题,需要在Spring配置文件中添加注解支持的配置。 综上所述,要解决Spring AOP不生效的问题,需要注意以上几种情况,并根据具体情况进行相应的修改和调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring Aop失效的情況及解决办法](https://blog.csdn.net/weixin_43790613/article/details/113091496)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值