目录
finishBeanFactoryInitialization
4、freezeConfiguration(冻结BeanDifinition)
3、preInstantiateSingletons(将所有非懒加载的单利Bean进行初始化)
1)、getMergedLocalBeanDefinition
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(上)开始的系列。