bean的 加载流程 (文字叙述)
Spring中Bean的加载流程
1. 转换对应的beanname , 因为传入的参数name 可能是别名,可能是FactoryBean ,解析内容包括 去除FactoryBean 的 &,
取到alias 对应的beanName(最终版——真爱,不是中间的那些狐狸精)
2. 尝试从缓存中加载单例,如果失败则尝试从singletonFactories中加载, 因为在创建bean的时候会存在依赖注入的情况
而在创建依赖的时候为了避免循环依赖,在Spring中创建bean的时候,不等笨啊创建完成就会将创建bean的ObjectFactory
提早曝光加入缓存中,一旦下一个bean创建的时候小依赖上一个bean则直接使用ObjectFactory。
3. bean 实例化
缓存中记录的只是最原始的bean状态,并不一定是我们最终需要的产品(期间可能需要进行逻辑处理)
4. 原型模式的依赖检查
只有单例情况下才会去尝试解决循环依赖。因为是单例啊,一个容器,只有一个bean。
5. 检测parentFactory
如果缓存中没有数据直接转到父类工厂上加载(如果有父类工厂的话)
6. 将存储XML配置文件的GernericBeanDefinition 转换为RootBeanDefinition, 不要理解为强制类型转换,兄弟层面的类
怎么可以进行强制类型转换呢!
关于为什么要进行转换的问题。浅显看来,GenericBeanDefinition里面多是继承了AbstractBeanDefinition的逻辑,没
有什么自定义的逻辑存在,甚至可以看成是AbstractBeanDefinition的实现类,而RootBeanDefinition里面有着大量处理逻辑。
7. 寻找依赖
在bean的初始化过程中很可能会用到某些属性,而某些属性很可能是动态配置的,并且配置成依赖于其他的bean, 那么这
个时候就要先加载依赖的bean,所以,在Spring的加载顺序中,初始化某一个bean的时候首先初始化这个bean依赖的bean。
这是不是很熟悉,就想加载子类先把父类加载出来似的。
8. 针对不同的scope进行bean的创建
在Spring中存在不同的scope (默认 singleton, 还有prototype、request、session)
单例(Singleton): 在整个应用中,创建一个bean
原型(Prototype): 每次注入或者通过Spring上下文获取的时候都会创建一个新的bean
会话(Session):在Web应用中,为每个会话创建一个bean实例
请求(Request)在Web应用中,为每个请求创建一个bean
9. 类型转换
Check if required type matches the type of the actual bean instance.
加载结束