先上图,了解一下整体流程图:
最核心的代码就是AbstractApplicationContext当中的refresh方法了:
prepareRefresh:容器刷新前的准备工作:主要是生成Environment并且加载properteis文件
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory():加载xml配置文件,生成DefaultListableBeanFactory,同时加载BeanDefinitions,也就是loadBeanDefinitions(beanFactory);方法,参数beanFactory就是前面生成的DefaultListableBeanFactory,oadBeanDefinitions根据不同的配置方式有不同的加载方式,常用的ClassPathApplicationContext就是调用的org.springframework.context.support.AbstractXmlApplicationContext#loadBeanDefinitions(org.springframework.beans.factory.support.DefaultListableBeanFactory)
prepareBeanFactory(beanFactory):准备beanfactory,主要是添加beanpostprocessor,忽略aware接口,aware接口会在后续流程中统一处理,同时设置上一步创建好的beanfactory的其他属性(比如classloader和el表达式解析器)
postProcessBeanFactory(beanFactory):默认空,BeanFactory 准备工作完成后进行的后置处理工作,交由子类实现,比如有注解驱动的后置处理器,以及web类型的后置处理器(org.springframework.web.context.support.AbstractRefreshableWebApplicationContext#postProcessBeanFactory等)
invokeBeanFactoryPostProcessors(beanFactory):BeanFactory的后置处理器。在BeanFactory标准初始化后执行的,标准初始化就是前面的4步,也可以理解为:调用上下文中注册为bean的工厂处理器。 执行BeanFactoryPostProcessors()
registerBeanPostProcessors(beanFactory):注册bean后置处理器,可以看到不论是beanfactory还是bean在实例化之前都需要先注册后置处理器
initMessageSource:国际化功能:消息解析,消息绑定
initApplicationEventMulticaster:初始化事件监听器
onRefresh:同postProcessBeanFactory方法一样,交由子类实现,在容器刷新的时候可以自定义逻辑
registerListeners:注册事件监听器,并且发布早期事件,也就是注册initApplicationEventMulticaster初始化过的事件监听器
finishBeanFactoryInitialization:这个方法就是最核心的方法了,一个是解析我们自定义的业务配置文件(因为要开始实例化业务bean了,所以提前解析配置文件),比如PropertyPlaceholderConfigurer(它其实实现了BeanFactoryPostProcessor),另一个就是实例化所有剩下的单实例bean,也就是通常我们自定义的业务bean会在这一步进行实例化:org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization最后一行:beanFactory.preInstantiateSingletons(); 会调用到org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons这个方法,也就是getBean方法从这里开始,getBean核心方法:org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean,创建bena的核心方法:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean