- IOC 的配置文件加载完毕后,接下来就是 IOC 的流程。
在源码中的体现就是调用 refresh():
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
this();
this.register(componentClasses);
// IOC 流程
this.refresh();
}
- IOC 流程有很多步骤,大致分为一下步骤
public void refresh() throws BeansException, IllegalStateException {
synchronized(this.startupShutdownMonitor) {
this.prepareRefresh();
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
this.prepareBeanFactory(beanFactory);
try {
this.postProcessBeanFactory(beanFactory);
this.invokeBeanFactoryPostProcessors(beanFactory);
this.registerBeanPostProcessors(beanFactory);
this.initMessageSource();
this.initApplicationEventMulticaster();
this.onRefresh();
this.registerListeners();
this.finishBeanFactoryInitialization(beanFactory);
this.finishRefresh();
} catch (BeansException var9) {
if (this.logger.isWarnEnabled()) {
this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
}
this.destroyBeans();
this.cancelRefresh(var9);
throw var9;
} finally {
this.resetCommonCaches();
}
}
}
- 总结就是一下这些方法
-
IOC 的流程包含许多的后置处理器的执行
-
incokeBeanFactoryPostProcessor() ,这是一个bean工厂后置处理器,用来解析配置文件,将一些bean放入beanDefinition中
解析配置类
- 解析配置文件主要是在 incokeBeanFactoryPostProcessor() 中,主要将配置类中标注了 @ComponmentScan 等注解对应的类中的 bean 放入 beanDefinitionMap 中,因为在配置文件的注册那一步,并没有将其他包下的bean 注册到 BeanDefinition 中。
创建bean
- 接下来执行 finishBeanFactoryInitialization(),来创建bean
-
在这个方法里会获取 beanDefinitionMap ,遍历所有的beanDefinition 去生成bean
-
这个循环最终会走到 getBean() 去生产 bean
-
生产bean 的步骤:
实例化 bean
属性赋值
初始化