4.Spring
Spring的aop顺序
-
AOP常用注解
- @Before
- 前置通知:目标方法之前执行
- @After
- 后置通知:目标方法之后执行(始终执行)
- @AfterReturning
- 返回后通知:执行方法结束前执行(异常不执行)
- @AfterThrowing
- 异常通知:出现异常时候执行
- @Around
- 环绕通知:环绕目标方法执行
- @Before
-
面试题
- 你肯定知道Spring,那说说aop的全部通知顺序,
- SpringBoot或SpringBoot2对AOP的执行顺序影响?
- 说说你使用AOP中碰到的坑?
- 。。。
-
业务类
- 接口CalcService
- 接口实现类CalcServiceImpl新加@Service
- 想在除法方法前后置入各种通知,引入切面编程
-
新建一个切面类MyAspect并为切面类新增两个注解
- @Aspect
- 指定一个类为切面类
- @Component
- 纳入spring容器管理
- code
- @Aspect
-
Spring4+SpringBoot1.5.9
-
pom
-
测试类
- 报错:java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=…) with your test
解决:单元测试的测试类一定要和启动类在同一个根目录下。
-
aop正常顺序+异常顺序
-
-
Spring5+SpringBoot2.3.3
- pom
springboot改为2.3.3 - 测试类
- aop正常顺序+异常顺序
- pom
-
结论
Spring的循环依赖
- 恶心的大厂面试题
- 你解释下spring中的三级缓存?
- 三级缓存分别是什么?三个Map有什么异同?
- 什么是循环依赖?请你谈谈?看过Spring源码吗?一般我们说的Spring容器是什么?
- 如何检测是否存在循环依赖?实际开发中见过循环依赖的异常吗?
- 多例的情况下,循环依赖问题为什么无法解决?
- 。。。。
- 什么是循环依赖
- 多个Bean之间相互依赖,形成了一个闭环。比如:A依赖于B、B依赖于C、C依赖于A
- 代码
- 代码
- 通常来说,如果问spring容器内部如何解决循环依赖,一定是指默认的单例bean中,属性互相引用的场景
- 多个Bean之间相互依赖,形成了一个闭环。比如:A依赖于B、B依赖于C、C依赖于A
- 两种注入方式对循环依赖的影响
- 循环依赖官网说明
官网地址
- 结论:
- 我们AB循环依赖问题只要A的注入方式是setter且singleton, 就不会有循环依赖问题
- 循环依赖官网说明
- spring容器循环依赖报错演示:BeanCurrentlyInCreationException
- 循环依赖现象在Spring容器中注入依赖的对象,有两种情况
- 构造器方式注入依赖
- code
- ServiceA
- ServiceB
- ClientConstructor
- 结论
- 构造器循环依赖是无法解决的,你想让构造器注入支持循环依赖,是不存在的
- 构造器循环依赖是无法解决的,你想让构造器注入支持循环依赖,是不存在的
- code
- 以set方式注入依赖
- code
- ServiceAA
- ServiceBB
- ClientSet
- code
- 构造器方式注入依赖
- 重要code案例演示
- code-java基础编码
- A
- B
- ClientCode
- A
- spring容器
- 默认的单例(singleton)的场景是支持循环依赖的,不报错
- 原型(prototype)的场景是不支持循环依赖的,会报错
- 步骤
- applicationContext.xml【xml去spring官网粘贴,https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-basics】
- 默认单例,修改为原型scope=“prototype”
- ClientSpringContainer
- 循环依赖异常
- applicationContext.xml【xml去spring官网粘贴,https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-basics】
- 默认的单例(singleton)的场景是支持循环依赖的,不报错
- 重要结论(spring内部通过三级缓存来解决循环依赖)
- DefaultSingletonBeanRegistry
- 循环依赖Debug-困难,请坚持
- 实例化 /初始化
- 实例化
- 内存中申请一块内存空间
- 租赁好房子,自己的家具东西还没有搬家进去
- 初始化 属性填充
- 完成属性的各种赋值
- 装修、家电家具进场
- 实例化
- 三个Map和四大方法,总体相关对象
- A/B两对象在三级缓存中的迁移说明
- 全部Debug断点
- 实例化 /初始化
- DefaultSingletonBeanRegistry
- 总结Spring是如何解决的循环依赖?
- 解释
- Debug的步骤—>spring解决循环依赖的过程
- 解释
- code-java基础编码
- 循环依赖现象在Spring容器中注入依赖的对象,有两种情况
彩蛋
- 1.Spring考点大纲
- 2.代码地址
- 3.打断点的艺术(如何定位bean在哪里创建-一步步debug,然后清除无关日志,排除缩小范围)
- 光标和debug断点合并到一处
- 步过
- 步入
- 强制步入
- 跳出
- resume program跳转到下一个断点
- 光标和debug断点合并到一处
- 4.读spring源码非常提升内功
- 断点入口寻找
- 5.做难事必有所得
- 6.走一遍Spring循环依赖底层代码,别的源码就不怕了
-