从这里进去:
refresh方法中,有10几个子方法,一个个讲。
1.prepareRefresh,刷新前的准备工作,比如:设置容器启动时间,设置活跃状态为true,设置关闭状态为false,获取environment对象,并加载当前的属性值到environment对象中,准备监听器和事件的集合对象,默认为空的集合。
2.obtainFreshBeanFactory,主要是创建容器对象(DefaultListableBeanFactory),生成BeanDefination,这个时候DefaultListableBeanFactory中的beanDefinationMap和beanDefinationName当中会有值。这里会进行xml文件解析,bean标签解析,创建beanDefination对象。
在loadBeanDefinitions方法中主要是读取本地文件库(dtd,xsd),解析xml文件,并完成beanDefination的加载。
解析的过程还是比较复杂的。大概的意思就是通过spring.schemas下的xsd所对应的解析类去解析xml标签,比如说解析<bean></bean>标签,解析完bean标签生成BeanDefination对象,并设置到beanFactory中的beanDefinationMap和beanDefinationNames中。
3.prepareBeanFactory(beanFactory),创建了beanfactory,但它当中很多属性都是为null,所以这个方法主要是对beanFactory属性进行填充。
4.postProcessBeanFactory(beanFactory),对bean工厂进行一些处理,比如添加beanFactoryPostProcess,由具体的子类去实现。
5.invokeBeanFactoryPostProcessors(beanFactory),调用执行各种beanFactory后置处理器。
6.registerBeanPostProcessors(beanFactory),注册BeanPostProcessor,只注册,不调用,等初始化的时候再调用。
7.initMessageSource,初始化MessageSource组件(做国际化功能;消息绑定,消息解析),这个接口提供了消息处理功能。主要用于国际化/i18n。
8.initApplicationEventMulticaster,多播器:方便后面发布监听事件。在Spring容器中初始化事件广播器,事件广播器用于事件的发布。程序首先会检查bean工厂中是否有bean的名字和这个常量(applicationEventMulticaster)相同的,如果没有则说明没有那么就使用默认的ApplicationEventMulticaster 的实现:SimpleApplicationEventMulticaster。
9.onRefresh,子类去实现。一个模板方法,不同的Spring容器做不同的事情。
比如web程序的容器ServletWebServerApplicationContext中会调用createWebServer方法去创建内置的Servlet容器。
目前SpringBoot只支持3种内置的Servlet容器:
- Tomcat
- Jetty
- Undertow
10.registerListeners,注册应用的监听器。就是注册实现了ApplicationListener接口的监听器bean,这些监听器是注册到ApplicationEventMulticaster中的。这不会影响到其它监听器bean。在注册完以后,还会将其前期的事件发布给相匹配的监听器
11.finishBeanFactoryInitialization(beanFactory),实例化剩下的(非懒加载)单例。循环beanDefinationNames,通过beanName从BeanDefinationMap中拿到beanDefination,实例化bean的时候,我们先调用getBean(beanName)方法,从缓存中查,看缓存中有没有,如果没有,我们则要doCreateBean,doCreateBean通过反射调用bean的构造方法创建出bean,创建出来以后会放入到三级缓存当中,然后填充属性populateBean,填充完以后调用initializeBean方法初始化,这个方法里面看你是否实现了Aware接口,如果实现了就执行Aware接口方法,然后调用BeanPostProcessor:postProcessBeforeInitialization方法,接着执行init方法,然后再调用BeanPostProcessor:postProcessAfterInitialization方法,完成初始化,然后返回对象实例,把它设置到一级缓存当中。
finishRefresh,完成context的刷新。主要是调用LifecycleProcessor的onRefresh()方法,并且发布事件(ContextRefreshedEvent)。
- 初始化生命周期处理器,并设置到Spring容器中(LifecycleProcessor)
- 调用生命周期处理器的onRefresh方法,这个方法会找出Spring容器中实现了SmartLifecycle接口的类并进行start方法的调用
- 发布ContextRefreshedEvent事件告知对应的ApplicationListener进行响应的操作