第
Spring源码:Bean的生命周期(二)
让我们继续讲解Spring的Bean实例化过程。在上一节中,我们已经讲解了Spring是如何将Bean定义加入到IoC容器中,并使用合并的Bean定义来包装原始的Bean定义。接下来,我们将继续讲解Spring的getBean()方法,特别是针对FactoryBean的解析。
在getBean()方法中,Spring还支持对FactoryBean进行特殊处理。FactoryBean是一个能够生成Bean实例的工厂Bean,其定义了getObject()方法,返回的是一个由工厂Bean管理的对象实例。在使用getBean()方法获取FactoryBean类型的Bean时,Spring会首先获取FactoryBean的实例,然后调用其getObject()方法来获取由工厂Bean创建的实际Bean实例。
因此,在使用getBean()方法获取Bean实例时,我们需要注意是否需要对FactoryBean进行特殊处理。如果需要获取FactoryBean的实例而不是它所管理的对象实例,可以在Bean名称前加上符号来进行标识。例如:myFactoryBean表示获取myFactoryBean的实例。但是博主看到第一篇源码写的篇幅确实有些长,可能对于大家伙的碎片化时间掌握的不是很充分,所以以后我会尽力控制篇幅长度,既保证逻辑的连续性也保证尽快可以看完,那么接下来开始进入正题getbean方法之FactoryBean解析。
FactoryBean
所有符合过滤条件的Bean在Spring解析后都会被转化为合并后的Bean定义。尽管Spring提供了getBean()方法用于获取Bean实例,但实际上它底层仍然使用createBean()方法来创建Bean实例。在创建Bean实例之前,Spring先对当前Bean定义进行判断,以确定其是否为FactoryBean类型:
publicvoidpreInstantiateSingletons()throwsBeansException{
if(logger.isTraceEnabled()){
logger.trace(Pre-instantiatingsingletonsin+this);
//Iterateoveracopytoallowforinitmethodswhichinturnregisternewbeandefinitions.
//Whilethismaynotbepartoftheregularfactorybootstrap,itdoesotherwiseworkfine.ListStringbeanNames=newArrayList(this.beanDefinitionNames);
//Triggerinitializationofallnon-lazysingletonbeans...
for(StringbeanName:beanNames){
//获取合并后的BeanDefinition
RootBeanDefinitionbd=getMergedLocalBeanDefinition(beanName);
if(!bd.isAbstract()bd.isSingleton()!bd.isLazyInit()){
if(isFactoryBean(beanName)){
//获取FactoryBean对象
Objectbean=getBean(FACTORY_BEAN_PREFIX+beanName);
if(beaninstanceofFactoryBean){
FactoryBeanfactory=(FactoryBean)bean;
booleanisEagerInit;
if(System.getSecurityManager()!=nullfactoryinstanceofSmartFactoryBean){
isEagerInit=AccessController.doPrivileged(
(PrivilegedActionBoolean)((SmartFactoryBean)factory)::isEagerInit,
getAccessCo