spring容器创建的主要流程在他的refresh()方法中,接下来就开始总结一个下他的refresh()方法中的每个步骤大概都做了那些事情。refresh() 可在AbstractApplicationContext中找到。
prepareRefresh
- 标识容器状为active
- 运行环境(包装为一个Environment类)的设置与验证。
obtainFreshBeanFactory
- 创建(new)BeanFactory,默认创建一个DefaultListableBeanFactory
- 然后进行bean定义信息的加载,封装为beanDefinition保存。
prepareBeanFactory
- 设置类加载器
- 设置Spel解析器
- 设置资源文件的字段解析器
- 设置一个后置处理器ApplicationContextAwareProcessor(完成对XXXAware,例如ApplicationContextAware等类的注入)
- 设置忽略注入接口
prepareBeanFactory(beanFactory)
留给子类的一个扩展方法。
invokeBeanFactoryPostProcessors
- 对BeanDefinitionRegistryPostProcessor(也是一个beanFactory后置处理器,可以重新注册一些bean定义信息)的postProcessBeanDefinitionRegistry()方法根据顺序调用。
- 对普通的BeanFactoryPostProcessor的postProcessBeanFactory()方法根据顺序调用。
registerBeanPostProcessors
- 按照顺序注册 BeanPostProcessor
- 按照顺序注册 MergedBeanDefinitionPostProcessor
initMessageSource
- 初始化消息资源(对国际化支持)如果配置了一个名为messageSource的MessageSource实现,那么使用配置的实现。否则使用一个默认的MessageSource(但它没什么用)
initApplicationEventMulticaster
- 初始化事件派发器(事件派发机制支持)如果配置了一个名为applicationEventMulticaster的ApplicationEventMulticaster实现,那么使用配置的实现。否则使用SimpleApplicationEventMulticaster。
onRefresh
留给子类扩展
registerListeners
- 获取ApplicationListener实现的全类名,进行注册保存。
finishBeanFactoryInitialization
- 获取剩余的beanDefinition准备初始化
- 调用InstantiationAwareBeanPostProcess的postProcessBeforeInstantiation (Class<?> beanClass, String beanName)尝试获取实例
- 选择合适的方式创建实例,默认反射用构造器创建
- 调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName)允许修改bean定义信息
- 调用InstantiationAwareBeanPostProcess的postProcessAfterInstantiation(Object bean, String beanName)实例创建后处理
- InstantiationAwareBeanPostProcessor的postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)允许在注入属性之前对属性进行一些修改
- 自动属性注入
- BeanPostProcessor的postProcessBeforeInitialization()方法调用
- 调用bean指定的init方法
- BeanPostProcessor的postProcessAfterInitialization()方法调用
finishRefresh
- 清除资源缓存
- 调用声明周期处理器的start()方法
- 发布ContextRefreshedEvent 容器刷新完成事件