1.ClassPathXmlApplicationContext为入口构造方法中有个refresh()方法用来初始化Spring
refresh运行的大致流程:
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();—-2
invokeBeanFactoryPostProcessors(beanFactory);——————————3
registerBeanPostProcessors(beanFactory);———————————–4
initMessageSource();——————————————————-5
initApplicationEventMulticaster();—————————————–6
onRefresh();—————————————————————7
registerListeners();——————————————————-8
beanFactory.preInstantiateSingletons();————————————9
publishEvent(new ContextRefreshedEvent(this));—————————–10
2.解析XML并且初始化工厂类,BeanFactory工厂提供了获得bean实例的能力,通过AbstractApplicationContext类中的obtainFreshBeanFactory方法调用refreshBeanFactory实例化一个默认的BeanFactory工厂DefaultListableBeanFactory,然后调用loadBeanDefinitions装载配置文件,解析配置文件(XmlBeanDefinitionReader)时会创建BeanDefinition并且放到容器DefaultListableBeanFactory中去
3.执行工厂后置处理器,这时会查找所有BeanFactory(DefaultListableBeanFactory)工厂中的bean找出所有BeanFactoryPostProcessor实现类bean,并且调用方法postProcessBeanDefinitionRegistry,这个方法可以在bean实例化之前修改配置信息(比如变量值)
PS:用户自定义BeanFactoryPostProcessor
4.注册后置处理器,这时会查找所有BeanFactory(DefaultListableBeanFactory)工厂中的bean找出所有BeanPostProcessor实现类bean,并且把他们注册到BeanFactory容器中去,和第3种工厂后置处理器的区别是BeanFactoryPostProcessor会立即调用,而BeanPostProcessor注册到BeanFactory中
PS:用户自定义BeanPostProcessor
5.默认注册一个bean名称为messageSource的bean用于国际化处理,这里Spring自带很多种实现,这个方法会先查找BeanFactory中的bean是否有messageSource名称的bean如果没有给一个默认的实现DelegatingMessageSource
PS:用户可以自定义名称为messageSource的bean,只需要实现MessageSource即可
6.Spring事件体系包括三个组件:事件,事件监听器,事件广播器。这里是初始化事件广播器,如果用户有自定义applicationEventMulticaster名称的bean并且实现ApplicationEventMulticaster则不需要处理,如果没有就给一个默认的实现SimpleApplicationEventMulticaster
PS:用户可以自定义名称applicationEventMulticaster并且实现ApplicationEventMulticaster接口的bean
7.初始化一些特殊的bean,一般很少用
8.Spring事件体系包括三个组件:事件,事件监听器,事件广播器。这里是事件监听器,上下文会在BeanFactory找到所有实现ApplicationListener的bean然后添加到事件广播器ApplicationEventMulticaster中去
9.初始化单例的bean,实例化BeanFactory中所有的bean,(Spring配置的是单例设置scope=”prototype”可以配置多例模式)
10.发布上下文刷新事件,事件广播器负责将些事件广播到每个注册的事件监听器中,容器启动完成