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 容器刷新完成事件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值