SpringIoc源码(十三)- ApplicationContext(九)- refresh(finishBeanFactoryInitialization)

目录

finishBeanFactoryInitialization

1、ConversionService

2、StringValueResolver属性替换

3、LoadTimeWeaverAware类型

4、freezeConfiguration(冻结BeanDifinition)

3、preInstantiateSingletons(将所有非懒加载的单利Bean进行初始化)

1)、getMergedLocalBeanDefinition

2)、isFactoryBean


finishBeanFactoryInitialization

1、ConversionService

if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
    beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
    beanFactory.setConversionService(
        beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
}

    如果存在Bean,并且是ConversionService的子类,则提前调用getBean方法进行初始化。

2、StringValueResolver属性替换

// Register a default embedded value resolver if no bean post-processor
// (such as a PropertyPlaceholderConfigurer bean) registered any before:
// at this point, primarily for resolution in annotation attribute values.
if (!beanFactory.hasEmbeddedValueResolver()) {
    beanFactory.addEmbeddedValueResolver(strVal -> 
        getEnvironment().resolvePlaceholders(strVal));
}

    如果有注册PropertyPlaceholderConfigurer 等类型,则在这里替换。

3、LoadTimeWeaverAware类型

    如果存在LoadTimeWeaverAware类型的bean, 则在这里提前进行遍历getBean操作。

// Initialize LoadTimeWeaverAware beans early to allow for 
// registering their transformers early.
String[] weaverAwareNames = beanFactory.getBeanNamesForType(
    LoadTimeWeaverAware.class, false, false);
for (String weaverAwareName : weaverAwareNames) {
    getBean(weaverAwareName);
}

4、freezeConfiguration(冻结BeanDifinition)

上面讲该提前getBean,或者说不论是否非单利懒加载的对象的都进行getBean操作。下面需要对马上进行getBean的Bean进行冻结。

// Allow for caching all bean definition metadata, not expecting further changes.
beanFactory.freezeConfiguration();
@Override
public void freezeConfiguration() {
    this.configurationFrozen = true;
    this.frozenBeanDefinitionNames = StringUtils.toStringArray(this.beanDefinitionNames);
}

    冻结的是之前通过loadBeanDefinition方法注册到DefaultListableBeanFactory的beanDefinitionNames中的名称。为下一步初始化所有非懒加载的单利bean做准备。

3、preInstantiateSingletons(将所有非懒加载的单利Bean进行初始化)

@Override
public void preInstantiateSingletons() throws BeansException {
    // Iterate over a copy to allow for init methods which in turn register new bean definitions.
    // While this may not be part of the regular factory bootstrap, it does otherwise work fine.
    List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

    // Trigger initialization of all non-lazy singleton beans...
    for (String beanName : beanNames) {
        RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
        if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
            if (isFactoryBean(beanName)) {
                Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
                if (bean instanceof FactoryBean) {
                    final FactoryBean<?> factory = (FactoryBean<?>) bean;
                    boolean isEagerInit;
                    if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                        isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
                                        ((SmartFactoryBean<?>) factory)::isEagerInit,
                                getAccessControlContext());
                    }
                    else {
                        isEagerInit = (factory instanceof SmartFactoryBean &&
                                ((SmartFactoryBean<?>) factory).isEagerInit());
                    }
                    if (isEagerInit) {
                        getBean(beanName);
                    }
                }
            }
            else {
                getBean(beanName);
            }
        }
    }

    // Trigger post-initialization callback for all applicable beans...
    for (String beanName : beanNames) {
        Object singletonInstance = getSingleton(beanName);
        if (singletonInstance instanceof SmartInitializingSingleton) {
            final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
            if (System.getSecurityManager() != null) {
                AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
                    smartSingleton.afterSingletonsInstantiated();
                    return null;
                }, getAccessControlContext());
            }
            else {
                smartSingleton.afterSingletonsInstantiated();
            }
        }
    }
}

    遍历所有的Bean名称,先获取Merged(合并的)BeanDefinition,因为拿到当前的Bean的元素是不行的还需要拿到父类的元素。只对非抽象的、非懒加载的、单利的Bean进行getBean操作;如果是FactoryBean类型则先获取FactoryBean(因为获取时在BeanName前加上了FACTORY_BEAN_PREFIX 符号)再获取Bean;否则直接调用getBean。

    在所有getBean完成后会调用已经实现了SmartInitializingSingleton的接口,回调afterSingletonsInstantiated方法。所以该方法的调用契机是,在所以Bean都初始化完成,再去调用该方法,所以一般会初始容器级别的事,而不是Bean的生命周期的事。详细可以参见Spring源码-事件监听机制(@EventListener实现方式)理解使用场景。

  剩下的就是getBean的实现,参见:SpringIoc源码(十五)- BeanFactory(四)- getBean(上)开始的系列。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值