这里讨论的版本是spring framework 5.3.X 的版本,如果逻辑有出入,先确定我们讨论的版本是不是一致
在 ApplicationContext中,IOC容器的启动通过org.springframework.context.support.AbstractApplicationContext#refresh 方法实现。而这其中bean的创建是通过 refresh中的 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 BeanFactoryPostProcessor
// (such as a PropertySourcesPlaceholderConfigurer bean) registered any before:
// at this point, primarily for resolution in annotation attribute values.
if (!beanFactory.hasEmbeddedValueResolver()) {
beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
}
// 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);
}
// Stop using the temporary ClassLoader for type matching.
beanFactory.setTempClassLoader(null);
// Allow for caching all bean definition metadata, not expecting further changes.
beanFactory.freezeConfiguration();
// Instantiate all remaining (non-lazy-init) singletons.
// 执行bean 的创建
beanFactory.preInstantiateSingletons();
}
在ApplicationContext中BeanFactory 的实现即 DefaultListableBeanFactory。所以代码来到 org.springframework.beans.factory.support.DefaultListableBeanFactory#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.
// 这里是一个arrayList,即先入先出,所以bean的创建顺序是根据Bean定义的顺序决定的
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
// Trigger initialization of all non-lazy singleton beans...
for (String beanName : beanNames) {
// 执行beanDefintion的合并,返回RootBeanDefinition。RootBeanDefinition和其他BeanDefinition的重要区别就在于root没有parentName,而且为了提升性能,在root中有很多 caching 缓存操作
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
// 循环加载单例的、非延迟加载的bean
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
// 判断是不是 FactoryBean,如果是的话,创建前要加前缀 &
if (isFactoryBean(beanName)) {
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
if (bean instanceof SmartFactoryBean<?> smartFactoryBean && smartFactoryBean.isEagerInit()) {
// 通过beanName创建bean
getBean(beanName);
}
}
else {
// 通过beanName创建bean
getBean(beanName);
}
}
}
// Trigger post-initialization callback for all applicable beans...
// 触发 SmartInitializingSingleton#afterSingletonsInstantiated 的回调
for (String beanName : beanNames) {
Object singletonInstance = getSingleton(beanName);
if (singletonInstance instanceof SmartInitializingSingleton smartSingleton) {
StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize")
.tag("beanName", beanName);
smartSingleton.afterSingletonsInstantiated();
smartInitialize.end();
}
}
}
所以这里创建的重点就在于org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)
这其中关于bean的创建是方法 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])
在 creataBean中的执行流程
这里
doCreateBean又是重重点。