Spring IOC容器的创建过程源码分析
作者:bin- 1.prepareRefresh()
- 2.obtainFreshBeanFactory()
- 3.prepareBeanFactory()
- 4.postProcessBeanFactory()
- 5.invokeBeanFactoryPostProcessors()
- 6.registerBeanPostProcessors()
- 7.initMessageSource()
- 8.initApplicationEventMulticaster()
- 9.onRefresh()
- 10.registerListeners()
- 11.finishBeanFactoryInitialization()
- 12.finishRefresh()
Spring容器的创建过程、Bean的创建过程,主要在refresh函数中完成,通常我们使用下面的方法去创建、以及初始化容器:
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(Config.class); annotationConfigApplicationContext.refresh(); //最终调用到AbstractApplicationContext.refresh()
在Spring Boot中,提供了run方法
SpringApplication.run(SpringBin.class, args); //最终调用到AbstractApplicationContext.refresh()
AbstractApplicationContext.refresh()代码如下:
public void refresh(){
synchronized (this.startupShutdownMonitor) {
// 1.准备初始化beanFactory的准备工作
prepareRefresh();
// 2.告诉子类刷新内部bean工厂
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 3.beanFactory的预准备工作
prepareBeanFactory(beanFactory);
try {
//4.在beanFactory创建,并预准备完成后,允许子类执行一些postProcess
postProcessBeanFactory(beanFactory);
// 5.执行beanFactory的PostProcessor,
invokeBeanFactoryPostProcessors(beanFactory);
// 6.注册beanPostProcessor
registerBeanPostProcessors(beanFactory);
// 7.做国际化,消息绑定,消息解析
initMessageSource();
// 8.初始化事件派发器
initApplicationEventMulticaster();
// 9.留给子类,在容器刷新时,可以重写这个方法自定义逻辑
onRefresh();
// 10.将时间监听器,添加到事件派发器中,并且将早起事件先派发
registerListeners();
// 11.初始化所有剩下的单实例bean
finishBeanFactoryInitialization(beanFactory);
// 12.完成容器创建,派发创建事件等
finishRefresh();
....
然后我们逐个来看每个方法都做了什么
1.prepareRefresh()
prepareRefresh主要完成,初始化beanFactory的准备工作
protected void prepareRefresh() {
...
// 初始化属性配置,主要给继承AbstractApplicationContext的子类实现
initPropertySources();
// 验证属性合法性
getEnvironment().validateRequiredProperties();
//保存早期事件
this.earlyApplicationEvents = new LinkedHashSet<>();
2.obtainFreshBeanFactory()
刷新bean工厂的实例,其中2个都是抽象方法,由子类来做具体实现
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
//调用到GenericApplicationContext.refreshBeanFactory()
refreshBeanFactory();
//调用到GenericApplicationContext.refreshBeanFactory()
return getBeanFactory();
}
GenericApplicationContext类部分内容如下
//默认工厂在类初始化就创建好了
public GenericApplicationContext() {
this.beanFactory = new DefaultListableBeanFactory();
}
....
//在刷新工厂时,只是设置了一个唯一id
@Override
protected final void refreshBeanFactory() throws IllegalStateException {
....
this.beanFactory.setSerializationId(getId());
}
....
//直接将beanFacotry返回
@Override
public final ConfigurableListableBeanFactory getBeanFactory() {
return this.beanFactory;
}
3.prepareBeanFactory()
在上一步中,beanFactory只是一个默认的工厂,什么都是空的,在这一步中,对beanFactory进行准备工作,设置一些属性
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
//设置类加载器
beanFactory.setBeanClassLoader(getClassLoader());
....
//添加bean部分BeanPostProcessor
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
//设置忽略的自动装配的接口,基础类这些接口的,不能自动注入到工厂中
beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
....
//在bean属性的注入时,如果根据第一个参数指定类型注入,就直接注入第二个参数的对象
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
....
//添加bean部分BeanPostProcessor
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
// 添加编译时,对aspectJ支持
if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
....
}
// 向单例容器中注册一些基础对组件
// 注册类3个:ENVIRONMENT_BEAN_NAME、SYSTEM_PROPERTIES_BEAN_NAME、SYSTEM_ENVIRONMENT_BEAN_NAME
if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
}
if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
}
if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
}
}
4.postProcessBeanFactory()
在beanFactory创建,并预准备完成后,允许子类执行一些postProcess
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
//do nothing
}
5.invokeBeanFactoryPostProcessors()
在这步之前,beanFactory的创建以及预准备工作已经做完了,接下来按排序执行实现BeanDefinitionRegistryPostProcessor接口的postProcess,再排序执行其他beanFactoryProcessor
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
....
public static void invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactory beanFactory, List beanFactoryPostProcessors) {
....
//找到实现BeanDefinitionRegistryPostProcessor接口的postProcess,
//并且根据PriorityOrdered.class和Ordered.class排序
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
//执行这些postProcessor
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
....
//同理,并且根据PriorityOrdered.class和Ordered.class排序,执行其他的beanFactoryProcessor
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
6.registerBeanPostProcessors()
注册beanPostProcessor(bean的后置处理器,拦截bean的创建过程),根据优先级排序,注册beanPostProcessor
public static void registerBeanPostProcessors(
ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
//获取所有的beanPostPocessor
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
....
//注册实现PriorityOrdered.class的BeanPostProcessor
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
....
//注册实现Ordered.class的BeanPostProcessor
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
....
//注册没实现排序的BeanPostProcessor
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
....
//最后注册实现MergedBeanDefinitionPostProcessor接口的BeanPostProcessor
//对@Autowired和@Value的支持
registerBeanPostProcessors(beanFactory, internalPostProcessors);
....
}
7.initMessageSource()
做国际化,消息绑定,消息解析
protected void initMessageSource() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
//如果有messageSource就直接赋值
if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
....
}
else {
// 如果没有,就自己创建一个默认的
//一般可以用于取出国际化配置文件中的某个值,能按区域取
DelegatingMessageSource dms = new DelegatingMessageSource();
dms.setParentMessageSource(getInternalParentMessageSource());
this.messageSource = dms;
}
}
8.initApplicationEventMulticaster()
注册时间派发器,如果bean工厂中有就直接使用,如果没有就注册一个默认的
protected void initApplicationEventMulticaster() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
//如果容器中有,就使用容器中的事件派发器
if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
this.applicationEventMulticaster =
beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
....
}
else {
//如果没有配置,就使用一个默认的事件派发器
this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
....
}
}
9.onRefresh()
留给子类,在容器刷新时,可以重写这个方法自定义逻辑
protected void onRefresh() throws BeansException {
// For subclasses: do nothing by default.
}
10.registerListeners()
注册时间监听器,并且派发早期事件
protected void registerListeners() {
//bean工厂中获取实现来ApplicationListener.class到监听器
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
for (String listenerBeanName : listenerBeanNames) {
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
}
// 派发早期事件
Set earlyEventsToProcess = this.earlyApplicationEvents;
this.earlyApplicationEvents = null;
if (earlyEventsToProcess != null) {
for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
getApplicationEventMulticaster().multicastEvent(earlyEvent);
}
}
}
11.finishBeanFactoryInitialization()
执行到这一步,bean工厂的初始化工作就已经完全结束了,剩下就初始化所有剩下的单实例bean
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
....
beanFactory.preInstantiateSingletons();
跳过不重要的信息,直接看preInstantiateSingletons方法,
其中getBean的执行过程,可以参考篇文章:Spring geBean()方法执行过程
@Override
public void preInstantiateSingletons() throws BeansException {
//拿到所有的beanDefinitionNames(bean定义信息)
List beanNames = new ArrayList<>(this.beanDefinitionNames);
//全部bean都尝试加载
for (String beanName : beanNames) {
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
//确定是否需要加载
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
if (isFactoryBean(beanName)) {
//工厂bean加载方式
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
....
}
else {
//普通bean加载方式
getBean(beanName);
}
}
}
// 所有的bean都实例化完成后,
//查看所有的bean是否实现SmartInitializingSingleton接口
//执行afterSingletonsInstantiated()发放
smartSingleton.afterSingletonsInstantiated();
....
12.finishRefresh()
完成容器创建后的派发创建事件等
protected void finishRefresh() {
//清除上下文级别的资源缓存(例如来自扫描的ASM元数据)。
clearResourceCaches();
// 初始化生命周期处理器,可以通过实现LifecycleProcessor.class
// 接口,来接收容器的刷新、和关闭回调
initLifecycleProcessor();
// 调用生命周期处理器的刷新回调
getLifecycleProcessor().onRefresh();
// 发布容器刷新完成的事件
publishEvent(new ContextRefreshedEvent(this));
// 暴露一些MBean相关的东西(大多数时候这个步骤并不关心)
LiveBeansView.registerApplicationContext(this);
}