1、生命周期
划分为5个阶段:
创建前准备阶段、
创建实例阶段、
依赖注入阶段、
容器缓存阶段、
销毁实例阶段。
一、创建前准备阶段:
这个阶段主要的作用是, Bean 在开始加载之前, 需要从上下文和相关配置中解
析并查找 Bean 有关的扩展实现 ,
比如像 init-method - 容器在初始化 bean 时调用的方法、 destory-method ,容器在
销毁 bean 时调用的方法。
以及, BeanFactoryPostProcessor 这类的 bean 加载过程中的前置和后置处理。
这些类或者配置其实是 Spring 提供给开发者,用来实现 Bean 加载过程中的扩
展机制,在很多和 Spring 集成的中间件中比较常见,比如 Dubbo 。
二、创建实例阶段
这个阶段主要是通过反射来创建 Bean 的实例对象,并且扫描和解析 Bean 声明
的一些属性。
三、依赖注入阶段
如果被实例化的 Bean 存在依赖其他 Bean 对象的情况,则需要对这些依赖 bean
进行对象注入。比如常见的 @Autowired 、 setter 注入等依赖注入的配置形式。
同 时 , 在 这 个 阶 段 会 触 发 一 些 扩 展 的 调 用 , 比 如 常 见 的 扩 展 类 :
BeanPostProcessors (用来实现 bean 初始化前后的扩展回调)、
InitializingBean (这个类有一个 afterPropertiesSet() ,这个在工作中也比较常见)、
BeanFactoryAware 等等。
四、容器缓存阶段
容器缓存阶段主要是把 bean 保存到容器以及 Spring 的缓存中,到了这个阶段,
Bean 就可以被开发者使用了。
这个阶段涉及到的操作,常见的有, init-method 这个属性配置的方法, 会在这
个阶段调用。
以及像 BeanPostProcessors 方法中的后置处理器方法如 :
postProcessAfterInitialization ,也会在这个阶段触发。
五、销毁实例阶段
当 Spring 应用上下文关闭时,该上下文中的所有 bean 都会被销毁。
如果存在 Bean 实现了 DisposableBean 接口,或者配置了 destory-method 属性,
会在这个阶段被调用。
2、IOC工作流程:
第一个阶段,就是 IOC 容器的初始化
这个阶段主要是根据程序中定义的 XML 或者注解等 Bean 的声明方式,通过解析和加载后生成 BeanDefinition,然后把 BeanDefinition 注册到 IOC 容器。
第二个阶段,完成 Bean 初始化及依赖注入
这个阶段会做两个事情 ,
通过反射针对没有设置 lazy-init 属性的单例 bean 进行初始化。
完成 Bean 的依赖注入。
第三个阶段, Bean 的使用
通常我们会通过 @Autowired 或者 BeanFactory.getBean() 从 IOC 容器中获取指定的 bean 实例。
另外,针对设置 layy-init 属性以及非单例 bean 的实例化,是在每次获取 bean
对象的时候,调用 bean 的初始化方法来完成实例化的,并且 Spring IOC 容器不会去管理这些 Bean 。
3、AOP过程
Spring AOP 源码解析_Javadoop
核心BeanPostProcessor :发生在实例化Bean之后,拦截当前 bean 的 advisor、advice、interceptor,并且根据被代理类的实现方式来选择使用cglib还是jdk代理。
3、如何解决循环依赖
原因:多个 Bean 互相之间持有对方的引用就会 发生循环依赖。循环的依赖将会导致注入死循环。
解决过程:
Spring 中设计了三级缓存来解决循环依赖问题,当我们去调用 getBean() 方法
的时候, Spring 会先从一级缓存中去找到目标 Bean ,如果发现一级缓存中没有
便会去二级缓存中去找,而如果一、二级缓存中都没有找到,意味着该目标 Bean
还没有实例化。于是, Spring 容器会实例化目标 Bean ( PS :刚初始化的 Bean
称为早期 Bean ) 。然后,将目标 Bean 放入到二级缓存中,同时,加上标记是
否存在循环依赖。如果不存在循环依赖便会将目标 Bean 存入到二级缓存,否则,
便会标记该 Bean 存在循环依赖,然后将等待下一次轮询赋值,也就是解析
@Autowired 注解。等 @Autowired 注解赋值完成后,会将目标 Bean 存入到一
级缓存
Spring
一级缓存中存放所有的成熟 Bean
二级缓存中存放所有的早期 Bean
三级缓存中存放 代理 Bean:需要通过代理工厂实现的Bean实例化并且赋值之后存入到三级缓存中, 最终也会将赋值 好的 Bean 同步到一级缓存中。
4、BeanFactory和FactoryBean
首先, Spring 里面的核心功能是 IOC 容器,所谓 IOC 容器呢,本质上就是一个
Bean 的容器或者是一个 Bean 的工厂。
它能够根据 xml 里面声明的 Bean 配置进行 bean 的加载和初始化,然后
BeanFactory 来生产我们需要的各种各样的 Bean 。
所以我对 BeanFactory 的理解了有两个。
BeanFactory 是所有 Spring Bean 容器的顶级接口,它为 Spring 的容器定义了
一套规范,并提供像 getBean 这样的方法从容器中获取指定的 Bean 实例。
BeanFactory 在产生 Bean 的同时,还提供了解决 Bean 之间的依赖注入的能力,
也就是所谓的 DI 。
FactoryBean 是一个工厂 Bean ,它是一个接口,主要的功能是动态生成某一个
类型的 Bean 的实例,也就是说,我们可以自定义一个 Bean 并且加载到 IOC 容
器里面。
它里面有一个重要的方法叫 getObject() ,这个方法里面就是用来实现动态构建
Bean 的过程