ClassPathXmlApplicationContext#refresh

ClassPathXmlApplicationContext#refresh流程

1. 准备context: prepareRefresh()

do:

  1. 设置

    属性
    startupDateSystem.currentTimeMillis()
    closedfalse
    activetrue
  2. 初始化所有占位符属性源

  3. 验证被标记为required的属性是否可解析

  4. 初始化

    属性
    applicationListenersapplicationListeners
    earlyApplicationEventsLinkedHashSet
2. refresh BeanFactory: ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()

如果已经初始化BeanFactory:

  1. destroy beans
  2. close BeanFactory

do:

  1. 实例化BeanFactory

  2. 设置serializationId

  3. 自定义处理

    属性
    allowBeanDefinitionOverriding
    allowCircularReferences
  4. 加载<bean>,解析为BeanDefinition

3. 准备BeanFactory: prepareBeanFactory(beanFactory)

do:

  1. set: Bean ClassLoader, Bean ExpressionResolver, Property EditorRegistrar

  2. 添加BeanPostProcessor: ApplicationContextAwareProcessor, ApplicationListenerDetector

  3. ignore dependencyInterface

  4. register resolvableDependency

  5. 注册单例:environment, systemProperties, systemEnvironment

4. 【扩展接口】postProcessBeanFactory

允许子容器注册特殊的BeanPostProcessor

5. 调用BeanFactory PostProcessor

实现BeanFactoryPostProcessor接口,有一个方法postProcessBeanFactory,作用:操作BeanFactory

实现BeanDefinitionRegistryPostProcessor接口,新增了一个方法postProcessBeanDefinitionRegistry,可以注册BeanDefinition

do:执行顺序PriorityOrdered > Ordered > 无

  1. 先执行BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry
  2. 后执行BeanDefinitionRegistryPostProcessor#postProcessBeanFactory
  3. 最后执行BeanFactoryPostProcessor#postProcessBeanFactory
6. 注册Bean PostProcessor

do:注册顺序PriorityOrdered > Ordered > 无

  1. 注册Bean PostProcessor
7. 初始化Message Source

注册单例 messageSource

8. 初始化事件multicaster

注册单例 applicationEventMulticaster

9. 【扩展接口】onRefresh

允许子容器在实例化单例前,初始化特殊的Bean

10. 注册监听器
11. 实例化非懒加载的单例Bean
11.1 生命周期
  1. 实例化
  2. 属性填充
  3. 初始化
    1. Aware接口
      1. BeanNameAware#setBeanName
      2. BeanClassLoaderAware#setBeanClassLoader
      3. BeanFactoryAware#setBeanFactory
    2. 后置处理器前置处理
    3. InitializingBean#afterPropertiesSet
    4. 自定义初始化方法
    5. 后置处理器后置处理
  4. 【使用】
  5. 销毁容器
    1. DisposableBean#destroy
    2. destroy-method属性指定方法
11.2 循环依赖

场景:a和b循环依赖

  1. a实例化进三级缓存,属性填充b
  2. b实例化进三级缓存,属性填充a
    1. 一级和二级缓存没有,三级缓存有
    2. a从三级缓存移动到二级缓存:早期暴露,此处可能进行AOP代理
    3. 获取a
    4. b创建完从三级缓存移动到一级缓存
  3. 继续a属性填充,初始化,若早期暴露创建了proxy则从缓存取出代理替换当前target,然后移动到一级缓存
12. 完成refresh
  1. 清除resourceCaches
  2. 初始化LifecycleProcessor
  3. 传播refresh给LifecycleProcessor
  4. 发布ContextRefreshedEvent事件
小结
  1. 实例化BeanFactory
  2. 加载xml配置为BeanDefinition
  3. 调用BeanFactory后置处理器
  4. 注册Bean后置处理器
  5. 实例化非懒加载单例Bean
    1. 查缓存
    2. 实例化
    3. 属性填充
    4. 初始化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值