当前位置 博文首页 > dijinan2423的博客:Spring IoC源码解析之getBean

    dijinan2423的博客:Spring IoC源码解析之getBean

    作者:[db:作者] 时间:2021-08-12 15:11

    一、实例化所有的非懒加载的单实例Bean

      从org.springframework.context.support.AbstractApplicationContext#refresh方法开发,进入到实例化所有的非懒加载的单实例Bean的finishBeanFactoryInitialization(beanFactory)的方法:

    protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
            // 为Bean工厂设置类型转化器
            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));
            }
    
            // 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(new StringValueResolver() {
                    @Override
                    public String resolveStringValue(String strVal) {
                        return getEnvironment().resolvePlaceholders(strVal);
                    }
                });
            }
    
            // 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);
            }
    
            // Stop using the temporary ClassLoader for type matching.
            beanFactory.setTempClassLoader(null);
    
            //冻结所有的Bean定义 , 至此注册的Bean定义将不被修改或任何进一步的处理
            beanFactory.freezeConfiguration();
    
            //实例化剩下的单实例Bean
            beanFactory.preInstantiateSingletons();
        }
    cs