作用
实例化所有剩余的(非懒加载的)单例bean。
确保实例化所有非惰性init单例,同时考虑
{@link org.springframework.beans.factory.FactoryBean FactoryBean}。
如果需要,通常在工厂设置结束时调用。
如果无法创建一个单例bean,@throws BeansException。
注意:这可能已经离开工厂,一些bean已经初始化!
在这种情况下,调用{@link#destroySingletons()}进行完全清理。
@Override
public void preInstantiateSingletons() throws BeansException {
// 日志
if (logger.isTraceEnabled()) {
logger.trace("Pre-instantiating singletons in " + this);
}
// beanFactory里面的所有beanName
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
// 实例化开始
for (String beanName : beanNames) {
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
// 非抽象、单例、非懒加载的
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
// FactoryBean子类型 :(beanInstance instanceof FactoryBean)
if (isFactoryBean(beanName)) {
// 获取bean "&" + beanName
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
// FactoryBean子类型
if (bean instanceof FactoryBean) {
// 强转FactoryBean类型
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);
}
}
}
// 初始化回调
for (String beanName : beanNames) {
// 获取单例bean
Object singletonInstance = getSingleton(beanName);
if (singletonInstance instanceof SmartInitializingSingleton) {
StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize")
.tag("beanName", beanName);
SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
smartSingleton.afterSingletonsInstantiated();
return null;
}, getAccessControlContext());
}
else {
smartSingleton.afterSingletonsInstantiated();
}
smartInitialize.end();
}
}
}