什么是refresh()?

refresh()相信对于阅读过Spring源码的朋友并不陌生,ApplicationContext的自动装配功能正是通过这个函数完成的,其中有一些重要的子方法,如注册BeanFactoryPostprocessor、注册BeanPostprocessor、注册EventListener监听事件、提前完成非懒加载的bean的实例化。

refresh()在内部使用了一个对象锁保证线程安全,只能由一个线程进行自动装配或者是销毁。

// 在Spring的低版本只能通过xml加载创建bean,为了适配注解的方式,AnnotationConfigApplicationContext在refresh()之前完成一些事情来实现

refresh()的12步骤

1.prepareRefresh()

准备此上下文以进行刷新,修改了active = true表明当前正在进行的是创建过程。

初始化属性、初始化环境变量

2.obtainFreshBeanFactory()⭐

告诉子类刷新内部 Bean 工厂,对于xml方式,在这里加载xml文件的BeanDefinition;对于注解方式无操作,配置类方式等到第5步解析

refreshBeanFactory()方法有两个实现类的不同实现:

  • AbstractRefreshableApplicationContext:xml方式,loadBeanDefinitions(beanFactory)在这里加载xml文件的BeanDefinition
  • GenericApplicationContext:注解方式,没有什么感兴趣的过程
1
2
3
4
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
refreshBeanFactory();
return getBeanFactory();
}

3.prepareBeanFactory(beanFactory)

准备bean factory以在此上下文中使用。

注册了 2 个 BeanPostProcessor,一个是处理 Aware 接口的回调函数,一个是 ApplicationListenerDetector,还注册了 4 个可以被自动装配的依赖,还注册了 4 个系统环境的 bean 到单例池singletonObjects。

resolvableDependencies自动装配的属性池,如ApplicationContext可以用@Autowired自动注入

4.postProcessBeanFactory(beanFactory)

模板方法,允许在上下文子类中对 Bean 工厂进行后处理,看到一些web子类实现了

5.invokeBeanFactoryPostProcessors(beanFactory)⭐

在实例化 bean 前,先调用 BeanFactoryPostProcessor 后置处理器。

  1. 调用实现了 PriorityOrdered 接口的 BeanDefinitionRegistryPostProcessor,这里会有个默认的internalConfigurationAnnotationProcessor被调用,用于解析配置类,在doProcessConfigurationClass()解析标注了@Configuration的配置类,以及一些@ComponentScan、@Import、@PropertySource、@Bean等注解
  2. 调用实现了 Ordered 接口的 BeanDefinitionRegistryPostProcessor
  3. 最后,调用所有其他没有实现排序接口的 BeanDefinitionRegistryPostProcessor
  4. 调用给定的 BeanFactoryPostProcessor

6.registerBeanPostProcessors(beanFactory)⭐

注册截获 Bean 创建的 Bean 处理器

  1. 注册实现了 PriorityOrdered 接口的 BeanPostProcessor(MergedBeanDefinitionPostProcessor)
  2. 注册实现了 Ordered 接口的 BeanPostProcessor
  3. 现在,注册所有常规的 BeanPostProcessor
  4. 最后,重新注册所有 internal BeanPostProcessor

7.initMessageSource()

国际化

8.initApplicationEventMulticaster()

初始化此上下文的事件广播器,new 一个 SimpleApplicationEventMulticaster

9.onRefresh()

模板方法,在特定上下文子类中初始化其他特殊 bean,,看到一些web子类实现了

10.registerListeners()

注册监听器 bean

只有写了监听器bean才会注册,否则为空

11.finishBeanFactoryInitialization(beanFactory);⭐

实例化剩下的 (非懒加载) 单例 bean。

bean的生命周期

12.finishRefresh();

发布相应的事件,10步注册的监听器bean监听对应事件做出反应