回顾总结
到目前为止, Spring
源码中 AbstractApplicationContext#refresh
方法的已经解读到第11个方法 finishBeanFactoryInitialization
,前10个方法介绍了:
BeanFactory
的准备,创建,刷新,个性化BeanFactory
的扩展点,自定义属性解析;- 环境信息
Environment
的加载(包括环境变量、系统变量等); BeanDefinition
的加载,解析,自定义xml
的方式;BeanFactoryPostProcessor
的注册与执行流程,BeanDefinitionRegistryPostProcessor
的解析,ConfigurationClassPostProcessor
对Spring
注解的解析过程(@Component、@PropertySources、@PropertySource、@ComponentScans、@ComponentScan、@Import
等注解的解析),Spring Boot
是如何通过@Configuration+@Import + ImportSelector
进行自动装配的等;BeanPostProcessor
的注册流程;- 国际化,
Spring
事件驱动的加载执行过程;
finishBeanFactoryInitialization 解析过程
接下来开始解析 Spring
对 Bean
的创建过程,上源码:
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { // Initialize conversion service for this context. 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 BeanFactoryPostProcessor // (such as a PropertySourcesPlaceholderConfigurer bean) registered any before: // at this point, primarily for resolution in annotation attribute values. // 如果之前没有注册过任何 BeanFactoryPostProcessor(例如 PropertySourcesPlaceholderConfigurer bean), // 则注册一个默认的嵌入值解析器:此时,主要用于解析注释属性值。 if (!beanFactory.hasEmbeddedValueResolver()) { beanFactory.addEmbeddedValueResolver(strVal -> 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); // Allow for caching all bean definition metadata, not expecting further changes. // 允许缓存所有 bean 定义元数据,而不是期望进一步的更改 beanFactory.freezeConfiguration(); // Instantiate all remaining (non-lazy-init) singletons. // 实例化所有剩余的(非惰性初始化)单例 beanFactory.preInstantiateSingletons(); }
- 判断是否存在转换服务,有就设置
- 判断是否有内置的值解析器,没有就创建一个处理占位符的解析器
- 实例化LoadTimeWeaverAware,进行早期的Bean的创建
- 停