Spring容器的初始化是定义在AbstractApplicationContext的refresh方法中。首先是避免多线程同时初始化,先对初始化过程加锁。prepareRefresh方法,是容器初始化之前的准备,记录容器初始化的时间,并初始化一些参数。
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); 从这里开始,是获取容器需要的BeanFactory。obtainFreshBeanFactory是初始化BeanFactory,并返回初始化后的BeanFactory,具体实现是在AbstractRefreshableApplicationContext这个类的refreshBeanFactory 方法,主要的步骤有:
(1)直接创建一个DefaultListableBeanFactory
(2)客制化创建的BeanFactory,在这里做了两步,1是设置是否允许覆盖BeanDefinition;2是设置是否允许循环引用。
(3)加载BeanDefinition,这个步骤会被ApplicationContext的子类重写,如XmlWebApplicationContext。DefaultListableBeanFactory实现了BeanDefinitionRegistry接口,用于注册加载好的BeanDefinition。
(4)创建好BeanFactory后,prepareBeanFactory方法继续对BeanFactory初始化,主要做的工作有设置类加载器;设置BeanExpressionResolver以支持EL;设置PropertyEditorRegistrar;注册ApplicationContextAwareProcessor后置处理器(该后置处理器主要是用于设置Bean所需要获取的ApplicationContext的属性,也是在这里可以为bean注入ApplicationContext);注册需要忽视的接口和注册部分依赖;再注册一个后置处理器ApplicationListenerDetector(具体作用不清楚);最后再注册一些环境Bean用于ApplicationContext。
postProcessBeanFactory方法根据注释是在BeanFactory初始化后允许子类做进一步的处理,默认实现为空。
invokeBeanFactoryPostProcessors方法是注册BeanFactoryPostProcessor,并调用,具体还不清楚。
registerBeanPostProcessors方法是实例化实现了BeanPostProcessor接口的Bean,并将其注册到BeanFactory。
initMessageSource方法是初始化信息,用以支持国际化。
initApplicationEventMulticaster、onRefresh、registerListeners、finishBeanFactoryInitialization、finishRefresh等方法,目前还不熟悉。