Spring版本:
<version>5.2.1.RELEASE</version>
上一篇:14-Spring源码解析之refresh(7)——【onRefresh】和【registerListeners】
上一篇,我们讲解了refresh方法中调用的第9个onRefresh
方法和第10个registerListeners
方法。接着本篇文章讲解refresh
方法调用的第11个finishBeanFactoryInitialization
方法。也是Spring
中最核心的方法。
一、finishBeanFactoryInitialization
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 bean post-processor
// (such as a PropertyPlaceholderConfigurer bean) registered any before:
// at this point, primarily for resolution in annotation attribute values.
// 注册默认的嵌入值解析器
// 如:PropertyPlaceholderConfigurer
if (!beanFactory.hasEmbeddedValueResolver()) {
beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
}
// 根据LoadTimeWeaverAware类型,来获取LoadTimeWeaverAwareName,如果有则创建这个LoadTimeWeaverAware
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.
// 冻结所有的beanDefinition, 实际上就是将ArrayList类型的beanDefinition转为String类型
beanFactory.freezeConfiguration();
//-------------------------------------加载Bean---------------------------------------------
// Instantiate all remaining (non-lazy-init) singletons.
// 把所有非懒加载的Bean都实例化
beanFactory.preInstantiateSingletons();
}
public void freezeConfiguration() {
this.configurationFrozen = true;
this.frozenBeanDefinitionNames = StringUtils.toStringArray(this.beanDefinitionNames);
}
二、preInstantiateSingletons
方法
public void preInstantiateSingletons() throws BeansException {
if (logger.isTraceEnabled()) {
logger.trace("Pre-instantiating singletons in " + this);
}
// 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.
// 遍历副本以允许init方法注册新的beanDefinition。
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
// Trigger initialization of all non-lazy singleton beans...
for (String beanName : beanNames) {
// 是获取缓存的BeanDefinition对象并合并其父类和本身的属性
// BeanDfinitiaon定义公共的抽象累是AbstractBeanDefinition。
// 普通的Bean在Spring注册BeanDefinition的时候,实例化出来的是GenericBeanDefinition
// Spring内置的Bean在注册BeanDefinition的时候,实例化出来的是RootBeanDefinition,
// 这时候,就要用getMergedLocalBeanDefinition将所有的BeanDefinition都转换为RootBeanDefinition
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
// 不是抽象类&是单例&非懒加载
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
// 判断是否是工厂Bean
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 {
//-------------------------------------核心方法--------------------------------------------
// 普通Bean的实例化、属性注入、初始化等
// 下一篇文章介绍
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();
}
}
}
}
三、总结
refresh
方法调用的第11个方法finishBeanFactoryInitialization
所实现的功能:
-
【功能一】
- 将所有
BeanDefintiion
的都转换为RootBeanDefinition
类型,并判断是否是工厂Bean
,若是则按照工厂Bean
处理
- 将所有
-
【功能二】
- 根据
beanName
创建所有非工厂Bean
, 即调用getBean
方法
- 根据
下一篇文章,我们就来好好分析一下getBean
方法是如何加载Bean
的。