refresh()发生了什么
什么是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 | protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { |
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 后置处理器。
- 调用实现了 PriorityOrdered 接口的 BeanDefinitionRegistryPostProcessor,这里会有个默认的internalConfigurationAnnotationProcessor被调用,用于解析配置类,在doProcessConfigurationClass()解析标注了@Configuration的配置类,以及一些@ComponentScan、@Import、@PropertySource、@Bean等注解
- 调用实现了 Ordered 接口的 BeanDefinitionRegistryPostProcessor
- 最后,调用所有其他没有实现排序接口的 BeanDefinitionRegistryPostProcessor
- 调用给定的 BeanFactoryPostProcessor
6.registerBeanPostProcessors(beanFactory)⭐
注册截获 Bean 创建的 Bean 处理器
- 注册实现了 PriorityOrdered 接口的 BeanPostProcessor(MergedBeanDefinitionPostProcessor)
- 注册实现了 Ordered 接口的 BeanPostProcessor
- 现在,注册所有常规的 BeanPostProcessor
- 最后,重新注册所有 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监听对应事件做出反应