2.1.2_BeanFactory.getBean内部处理逻辑
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.1.2_BeanFactory.getBean内部处理逻辑相关的知识,希望对你有一定的参考价值。
在一个已经注册了BeanDefinition的BeanFactory中,通过getBean方法就可以获取到对应的Bean对象,但BeanFactory的内部处理逻辑还是非常复杂,主要的工作可以分为getBean和createBean两部分,下面以DefaultListableBeanFactory为例来说明。
getBean阶段:
1、DefaultListableBeanFactory本身继承了DefaultSingletonBeanRegistry类,内部持有已经创建的Singleton的实例。查找已有的Singleton中是否有这个Bean,有的话则进行加工并返回。
2、如果BeanFactory本身不包含此Bean定义,但是有parent,则会委派给parent去处理。
3、如果BeanFactory有此Bean定义,就需要在BeanFactory内创建这个Bean。这时需要对BeanDefinition进行处理,获取DependentBean(通过getBean的递归使用),然后根据Bean类型(Singleton、Prototype、Scope)等来创建Bean。
4、最后根据需要进行类型转换。
createBean阶段:
1、通过resolveBeanClass来加载所需要的Class。
2、然后对Class进行一些InstantiationAwareBeanPostProcessor的处理。
3、接下来doCreateBean进行实际的Bean创建的工作,此时根据Bean定义使用Factory、自定义初始化函数或通用模式进行Bean创建。
4、通过populateBean进行初始化之后的预处理以及字段注入操作,注入模式包括byName和byType,然后会对普通的property进行设置。
5、然后会对Bean进行一些Aware的绑定操作(BeanNameAware等),BeanPostProcess处理、afterPropertiesSet、invokeCustomInitMethod等Bean内部的个性化配置操作。
6、最后会做一点检查,包括Singleton的一致性、对DisposableBean的特殊处理等,这样就完成了Bean的创建工作。
以上是关于2.1.2_BeanFactory.getBean内部处理逻辑的主要内容,如果未能解决你的问题,请参考以下文章
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type错误的解决办法