bean的创建流程
bean在spring中的生命周期
使用
以下为一个bean的获取并使用流程
1 | |
流程
首先是加载配置信息,这一步在
XmlBeanFactory创建出来之后就完成了。在其中保存了bean的相关信息,比如id、name、类型、构造方法参数等等getBean方法中去真正创建bean
如果是单例模式,且缓存中有这个bean,就直接返回。没有则进行下一步
对Prototypre模式的做循环依赖检查
如果有父Factory,且当前工厂没有这个bean的配置信息,则交给父类工厂创建。在ssm模式中一般存在两个容器:Spring和SpringMVC,应该就是这种关系,确保MVC容器可以访问父类容器的bean
查找依赖,这一步也会进行循环依赖检查。有依赖的情况下,就开始递归创建依赖bean
根据不同的scope开始创建流程,在此暂时只讨论singleton类型的bean,也就是
getSingleton(String beanName, ObjectFactory<?> singletonFactory)- 首先会将当前beanName添加到
singletonsCurrentlyInCreation - 调用
AbstractAutowireCapableBeanFactory#createBean方法 - BeanPostProcessors会被调用,可以用来创建代理,然后直接返回
- 如果没有代理,则进入Spring的创建方法doCreateBean
- 再然后就是根据配置信息,决定用哪种实例化方案
- 当实例创建后,就会根据条件决定放不放入
singletonObjects,同时从earlySingletonObjects中清除 - 再然后的方法
getEarlyBeanReference说是可以注入aop,但是暂时没有找到相关代码
- 首先会将当前beanName添加到
接着开始注入属性,,一般来说就是通过name、type注入;如果有循环依赖的话,就去缓存里获取半成品bean
初始化bean,一般就是调用一些相关方法,比如
init-method,继承的接口,以及一些BeanPostProcessor注册销毁处理器,销毁时调用相关方法
最后通过一个
getObjectForBeanInstance来处理一些诸如factory-bean类型,获取真正的bean
ApplicationContext
实际开发中,基本不会用BeanFactory的方式,都是使用ApplicationContext。这里已ClassPathXmlApplicationContext为例
- 检查当前环境,例如判断是否有环境变量未设置
- 创建beanFactory
- 注册激活BeanFactory处理器,例如注入后置处理器,事件监听器
- 初始化所有单例bean
- 事件通知
再配上一张SpringMVC流程图

参考资料
bean的创建流程
http://blog.inkroom.cn/2021/06/09/16VTBQC.html