Spring以其强大的IOC(控制反转)和依赖注入功能而闻名,Bean的加载流程是整个应用程序初始化的核心步骤之一,它涉及到一系列的生命周期过程和初始化的步骤,确保Bean被正确地配置、依赖注入,并且能够以可预测的方式运行。
配置方式有:
@ComponentScan("org.yian.bean")
@Configuration
public class BeanConfig {
@Bean
public Test test(){
return new Test();
}
}
@Test
public void test03(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);
applicationContext.close();
}
重点关注 refresh() 方法,该方法实际是调用的父类 AbstractApplicationContext 的方法:
public AnnotationConfigApplicationContext(Class>... componentClasses) {
this();
this.register(componentClasses);
this.refresh();
}
public void refresh() throws BeansException, IllegalStateException {
synchronized(this.startupShutdownMonitor) {
StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
this.prepareRefresh();
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
this.prepareBeanFactory(beanFactory);
try {
this.postProcessBeanFactory(beanFactory);
StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
this.invokeBeanFactoryPostProcessors(beanFactory);
this.registerBeanPostProcessors(beanFactory);
beanPostProcess.end();
this.initMessageSource();
this.initApplicationEventMulticaster();
this.onRefresh();
this.registerListeners();
this.finishBeanFactoryInitialization(beanFactory);
this.finishRefresh();
} catch (BeansException var10) {
if (this.logger.isWarnEnabled()) {
this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var10);
}
this.destroyBeans();
this.cancelRefresh(var10);
throw var10;
} finally {
this.resetCommonCaches();
contextRefresh.end();
}
}
}
图片
prepareRefresh():
图片
obtainFreshBeanFactory()
创建了一个this.beanFactory = new DefaultListableBeanFactory()
设置id
图片
prepareBeanFactory(beanFactory)
图片
postProcessBeanFactory(beanFactory)
5.执行BeanFactoryPostProcessor的方法:
图片
invokeBeanFactoryPostProcessors(beanFactory)
获取所有的BeanDefinitionRegistryPostProcessor
先执行实现了PriorityOrdered优先级接口的BeanDefinitionRegistryPostProcessor:postProcessor.postProcessBeanDefinitionRegistry(registry)
再执行实现了Ordered顺序接口的BeanDefinitionRegistryPostProcessor:postProcessor.postProcessBeanDefinitionRegistry(registry)
最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessors:postProcessor.postProcessBeanDefinitionRegistry(registry)
获取所有的BeanFactoryPostProcessor
先执行实现了PriorityOrdered优先级接口的BeanFactoryPostProcessor:postProcessor.postProcessBeanFactory()
再执行实现了Ordered顺序接口的BeanFactoryPostProcessor:postProcessor.postProcessBeanFactory()
最后执行没有实现任何优先级或者是顺序接口的BeanFactoryPostProcessor:postProcessor.postProcessBeanFactory()
图片
图片
8.初始化事件派发器:
图片
图片
图片
图片
判断是否是FactoryBean,是否是实现FactoryBean接口的Bean
不是工厂Bean,利用getBean(beanName)创建对象
检查所有的Bean是否是SmartInitializingSingleton接口的,如果是就执行afterSingletonsInstantiated()
图片
createBean(beanName, mbd, args)
resolveBeforeInstantiation(beanName, mbdToUse):让BeanPostProcessor先拦截返回代理对象,InstantiationAwareBeanPostProcessor提前执行,先触发postProcessBeforeInstantiation(),如果有返回值则触发postProcessAfterInitialization()
doCreateBean(beanName, mbdToUse, args):创建Bean
将创建的Bean添加到缓存中singletonObjects
doCreateBean(beanName, mbdToUse, args):
图片
拿到InstantiationAwareBeanPostProcessor后置处理器,执行postProcessAfterInstantiation()和postProcessPropertyValues()
applyPropertyValues(beanName, mbd, bw, pvs):应用Bean属性的值,为属性利用setter方法等进行赋值
invokeAwareMethods(beanName, bean):执行xxxAware接口的方法
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName):执行后置处理器初始化之前
invokeInitMethods(beanName, wrappedBean, mbd):执行初始化方法,是否是InitializingBean接口的实现;是否自定义初始化方法
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName):执行后置处理器初始化之后
从一级或者二级缓存中获取Bean的实例,不从三级缓存中取
注册Bean的销毁方法
图片