回顾总结
到目前为止, 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的创建
- 停止使用临时的类加载器
- 冻结BeanDefinition的元数据信息,防止被修改</

本文详细解析了Spring框架在Bean创建前的准备工作,包括finishBeanFactoryInitialization过程、转换服务ConversionService的初始化、自定义转换器的配置、默认值解析器的设置,以及Bean创建前的其他准备工作,如早期Bean的创建、类加载器的停止和BeanDefinition元数据的冻结等。
最低0.47元/天 解锁文章
523

被折叠的 条评论
为什么被折叠?



