spring ioc容器创建过程-整体流程

前面写了四篇ioc容器的初始化过程,这篇文章就对ioc容器初始化做个总结:
Spring ioc容器创建过程(1)BeanFactory初始化
spring ioc容器创建过程(2)invokeBeanFactoryPostProcessors
spring ioc容器创建过程(3)registerBeanPostProcessors
spring ioc容器创建过程(4)事件广播与注册监听

一、spring ioc 创建总览

整体初始化代码:

public void refresh() throws BeansException , IllegalStateException {
    synchronized (this. startupShutdownMonitor) {
        //准备刷新的上下文环境
        prepareRefresh() ;
        
        //初始化BeanFactory
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory() ;
        
        //对BeanFactory 进行各种功能填充
        prepareBeanFactory(beanFactory) ;
        try {
        
            //子类覆盖方法做额外的处理
            postProcessBeanFactory(beanFactory) ;
            //激活各种BeanFactory 处理器
            invokeBeanFactoryPostProcessors(beanFactory) ;
            //注册拦截Bean 后置处理器, 这里只是注册,真正的调用是在getBean的时候
            registerBeanPostProcessors(beanFactory);
            //为上下文初始化Message 源, 即不同语言的消息体, 国际化处理
            initMessageSource();
            
            //初始化应用消息广播器, 并放入applicationEventMulticaster中
            initApplicationEventMulticaster();
            
            //留给子类来初始化其它的Bean
            onRefresh();
            
            //在所有注册的bean中查找Listenerbean ,注册到消息广播中
            registerListeners();
            
            //初始化剩下的单实例(非惰性的)
            finishBeanFactoryinitialization(beanFactory);
            
            //完成refresh,同时发出ContextRefreshEvent 通知别人
            finishRefresh() ;
        catch (BeansException ex) {
            destroyBeans();
            cancelRefresh(ex) ,
            throw ex;
    }
}

画了个整体的流程图:
请添加图片描述

二、BeanFactory和ApplicationContext

可以看到AbstractApplicationContext#refresh()的第一步就是初始化BeanFactory。在Spring 中, BeanFactory 接口的各种实现负责bean实例化,为Spring 管理的bean提供
依赖注入和生命周期支持。
作为BeanFactory 接口的扩展, ApplicationContext 还提供其他有用的功能。
使用ApplicationContext 的最大好处是,它允许以完全声明的方式配置和管理Spring 以及Spring 所管理的资源。这意味着Spring 尽可能提供支持类来自动将ApplicationContext 加载到应用程序中,从而不需要编写任何代码来访问ApplicationContext。
相比BeanFactory,AbstractApplicationContext 增加了过久啊,事件广播等功能,AbstractApplicationContext内建可查找的依赖:
Bean 名称Bean 实例 使用场景environment Environment 对象 外部化配置以及ProfilessystemProperties java.util.Properties 对象 Java 系统属性systemEnvironment java.util.Map 对象 操作系统环境变量messageSource MessageSource 对象国际化文案lifecycleProcessor LifecycleProcessor 对象 Lifecycle Bean 处理器applicationEventMulticaster ApplicationEventMulticaster 对 象 Spring 事件广播器

Bean 名称Bean 实例使用场景
environmentEnvironment 对象外部化配置以及Profiles
systemPropertiesjava.util.Properties对象 Java 系统属性
systemEnvironmentjava.util.Map 对象操作系统环境变量
messageSourceMessageSource 对象国际化文案
applicationEventMulticasterApplicationEventMulticaster 对 象Spring 事件广播器
lifecycleProcessorLifecycleProcessor 对象Lifecycle Bean 处理器

三、初始化DefaultListableBeanFactory

为什么在AbstractApplicationContext中初始化的的BeanFactory是DefaultListableBeanFactory
请添加图片描述
DefaultListableBeanFactory继承了多种BeanFactory:

  1. HierarchicalBeanFactory接口是在继承BeanFactory的基础上,实现BeanFactory的父子关系。
  2. AutowireCapableBeanFactory接口是在继承BeanFactory的基础上,实现Bean的自动装配功能
  3. ListableBeanFactory接口是在继承BeanFactory的基础上,实现Bean的list集合操作功能
  4. ConfigurableBeanFactory接口是在继承HierarchicalBeanFactory的基础上,实现BeanFactory的全部配置管理功能,SingletonBeanRegistry是单例bean的注册接口。
  5. ConfigurableListableBeanFactory接口是继承AutowireCapableBeanFactory,ListableBeanFactory,ConfigurableBeanFactory三个接口的一个综合接口

可以看到DefaultListableBeanFactory可以满足大部分使用BeanFactory的场景了。

四、总结:

下面概括一下CApplicationContext 初始化的步骤:

  1. 初始化前的准备工作,例如对系统属性或者环境变量进行准备及验证。
  2. 初始化BeanFactory,并进行XML 文件读取。
    ApplicationContext 包含着BeanFactory 所提供的一切特征,在这一步骤中将会复用BeanFactory 中的配置文件读取解析及其他功能,这一步之后,lApplicationContext 实际上就已经包含了BeanFactory 所提供的功能,也就是可以进行bean 的提取等基础操作了。
  3. 对BeanFactory 进行各种功能填充。
    @Qualifier 与@Autowired 应该是大家非常熟悉的注解,那么这两个注解正是在这一步骤中增加的支持。
  4. 子类覆盖方法做额外的处理。
  5. 激活各种BeanFactory 处理器。
  6. 注册拦截bean 创建的bean 处理器,这里只是注册, 真正的调用是在getBean时候。
    7 .对不同语言的消息体进行国际化处理。
  7. 初始化应用消息广播器,并放入“applicationEventMulticaster” bean 中。
  8. 留给子类来初始化其他的bean。
  9. 在所有注册的bean 中查找listenerbean , 注册到消息广播器中。
  10. 初始化剩下的单实例。
  11. 完成刷新过程,通知生命周期处理器lifecycleProcessor 刷新过程,同时发出ContextRefreshEvent通知别人。
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值