Spring常用的设计模式
(1)工厂模式:Spring使用工厂模式,通过BeanFactory和ApplicationContext来创建对象
(2)单例模式:Bean默认为单例模式
(3)策略模式:例如Resource的实现类,针对不同的资源文件,实现了不同方式的资源获取策略
(4)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术
(5)模板方法:可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中,用来解决代码重复的问题。比如RestTemplate, JmsTemplate, JpaTemplate
(6)适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式,Spring MVC中也是用到了适配器模式适配Controller
(7)观察者模式:Spring事件驱动模型就是观察者模式的一个经典应用。
(8)桥接模式:可以根据客户的需求能够动态切换不同的数据源。比如我们的项目需要连接多个数据库,客户在每次访问中根据需要会去访问不同的数据库
AOP
注解
面试题
SpringBoot1.x.x 对应的是Spring4
Spring4 AOP的执行顺序
程序运行正常:
程序运行抛出异常:
SpringBoot2.x.x 对应的是Spring5
Spring5 AOP的执行顺序 直接记5的顺序
程序运行抛出异常:
总结:
Spring bean的循环依赖
Spring解决循环依赖的主要步骤:
Spring Bean的两种注入方式:
1.构造器注入 (容易导致循环依赖问题)
2. set方法注入 (避免循环依赖问题)
构造器注入 :A依赖B, B依赖A, A没有初始化(new出来),比也没有初始化(new 出来),导致相互依赖,相互初始条件不成立。
构造器注入
构造器注入没有办法解决循环依赖
Set方法注入
纯的java 通过Set方法注入可以解决循环依赖
Spring Bean中的循环依赖
Spring默认为单例模式,如果设置为Prototype(每次注入都会new 一个新对象)
Spring3级缓存
default Singleton Bean Registry
所谓三级缓存就是Spring为解决循环依赖的3个map
实例化和初始化概念:
spring循环依赖debug源码
容器和bean初始化完成的方法
getSingleton
doCreateBean
b依赖a
spring循环依赖总结
源码流程总结: