preInstantiateSingletons
v1.0 preInstantiateSingletons
tips:最终调用getBean使用的是RootBeanDefinition进行构建的
public void preInstantiateSingletons() throws BeansException {
if (logger.isTraceEnabled()) {
logger.trace("Pre-instantiating singletons in " + this);
}
//获取所有beanDefinition的名字
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
//循环
for (String beanName : beanNames) {
// 获取合并后的BeanDefinition,看代码V1.1
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
//如果RootBeanDefinition不是抽象BeanDefinition,是单例bean,非懒加载,则创建bean对象
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
if (isFactoryBean(beanName)) {
// 获取FactoryBean对象
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
if (bean instanceof 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) {
// 创建真正的Bean对象(getObject()返回的对象)
getBean(beanName);
}
}
}
else {
// 创建Bean对象
getBean(beanName);
}
}
}
// 所有的非懒加载单例Bean都创建完了后
//找出实现了SmartInitializingSingleton接口的单例bean,并执行afterSingletonsInstantiated()方法
for (String beanName : beanNames) {
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();
}
}
}
什么是抽象BeanDefinition?
V1.1 getMergedLocalBeanDefinition
合并BeanDefinition
protected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException {
// 先从RootBeanDefinitionMap中获取当前beanName对应的RootBeanDefinition对象
RootBeanDefinition mbd = this.mergedBeanDefinitions.get(beanName);
//如果已经存在,则直接返回
if (mbd != null && !mbd.stale) {
return mbd;
}
//如果不存在,则继续向下判断
return getMergedBeanDefinition(beanName, getBeanDefinition(beanName));
}
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
protected RootBeanDefinition getMergedBeanDefinition(
String beanName, BeanDefinition bd, @Nullable BeanDefinition containingBd)
throws BeanDefinitionStoreException {
synchronized (this.mergedBeanDe


最低0.47元/天 解锁文章

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



