接上篇Spring 源码详解IOC (一)最后一步(实例化剩下单例Bean)
在介绍接下来的流程之前先明确Bean定义信息和Bean实例化后的存储位置以及Bean创建的基本流程
举个注入的例子,CusBean的实例化需要注入CusDepBean的实例
AbstractApplicationContext.finishBeanFactoryInitialization()
↓
DefaultListableBeanFactory.preInstantiateSingletons()
@Override
public void preInstantiateSingletons() throws BeansException {
if (logger.isTraceEnabled()) {
logger.trace("Pre-instantiating singletons in " + this);
}
// 获取已经注册的BeanDefinition
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
// 所有非懒加载的单例Bean初始化
for (String beanName : beanNames) {
//合并BeanDenifition
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
//该BeanDefinition对应的对象既不是抽象类并且不是懒加载并且是单例
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
if (isFactoryBean(beanName)) {
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) {
getBean(beanName);
}
}
}
else {
//开始实例化调用AbstractBeanFactory.getBean->AbstractBeanFactory.doGetBean
getBean(beanName);
}
}
}
}
以下为Bean定义信息的合并以及待处理注入缓存的创建
Bean定义信息的合并以及待处理注入缓存的创建完成以后继续执行属性的填充和对象的初始化,先分析对象属性的填充
结束