Spring容器创建流程——总结

spring容器创建的主要流程在他的refresh()方法中,接下来就开始总结一个下他的refresh()方法中的每个步骤大概都做了那些事情。refresh() 可在AbstractApplicationContext中找到。

prepareRefresh

  1. 标识容器状为active
  2. 运行环境(包装为一个Environment类)的设置与验证。

obtainFreshBeanFactory

  1. 创建(new)BeanFactory,默认创建一个DefaultListableBeanFactory
  2. 然后进行bean定义信息的加载,封装为beanDefinition保存。

prepareBeanFactory

  1. 设置类加载器
  2. 设置Spel解析器
  3. 设置资源文件的字段解析器
  4. 设置一个后置处理器ApplicationContextAwareProcessor(完成对XXXAware,例如ApplicationContextAware等类的注入)
  5. 设置忽略注入接口

prepareBeanFactory(beanFactory)

留给子类的一个扩展方法。

invokeBeanFactoryPostProcessors

  1. 对BeanDefinitionRegistryPostProcessor(也是一个beanFactory后置处理器,可以重新注册一些bean定义信息)的postProcessBeanDefinitionRegistry()方法根据顺序调用。
  2. 对普通的BeanFactoryPostProcessor的postProcessBeanFactory()方法根据顺序调用。

registerBeanPostProcessors

  1. 按照顺序注册 BeanPostProcessor
  2. 按照顺序注册 MergedBeanDefinitionPostProcessor

initMessageSource

  1. 初始化消息资源(对国际化支持)如果配置了一个名为messageSource的MessageSource实现,那么使用配置的实现。否则使用一个默认的MessageSource(但它没什么用)

initApplicationEventMulticaster

  1. 初始化事件派发器(事件派发机制支持)如果配置了一个名为applicationEventMulticaster的ApplicationEventMulticaster实现,那么使用配置的实现。否则使用SimpleApplicationEventMulticaster。

onRefresh

留给子类扩展

registerListeners

  1. 获取ApplicationListener实现的全类名,进行注册保存。

finishBeanFactoryInitialization

  1. 获取剩余的beanDefinition准备初始化
  2. 调用InstantiationAwareBeanPostProcess的postProcessBeforeInstantiation (Class beanClass, String beanName)尝试获取实例
  3. 选择合适的方式创建实例,默认反射用构造器创建
  4. 调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName)允许修改bean定义信息
  5. 调用InstantiationAwareBeanPostProcess的postProcessAfterInstantiation(Object bean, String beanName)实例创建后处理
  6. InstantiationAwareBeanPostProcessor的postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)允许在注入属性之前对属性进行一些修改
  7. 自动属性注入
  8. BeanPostProcessor的postProcessBeforeInitialization()方法调用
  9. 调用bean指定的init方法
  10. BeanPostProcessor的postProcessAfterInitialization()方法调用

finishRefresh

  1. 清除资源缓存
  2. 调用声明周期处理器的start()方法
  3. 发布ContextRefreshedEvent 容器刷新完成事件

你可能感兴趣的:(死磕Spring,Spring源码分析)