spring解读【三】——IOC容器原理剖析

IOC容器介绍

Spring IOC是spring的核心容器,spring所有的功能都是围绕容器来进行扩展的。在没有IOC容器前,依赖服务通常是在构造器是new出来构建此对象;而Spring 通过配置描述 Bean 及 Bean 之间的依赖关系,利用 Java 的反射功能实例化 Bean 并建立 Bean 之间的依赖关系,IOC是控制反转的简称,也叫做依赖注入,也就是说将Bean的控制权交给spring,提供了 Bean 实例缓存、生命周期管理、 Bean 实例代理、事件发布、资源装载等高级服务。

IOC容器的组成

  • IOC容器的组成如图所示:
    这里写图片描述
    由图可知IOC容器主要由BeanFactory和ApplicationContext组成,BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;ApplicationContext 面向使用Spring 框架的开发者,几乎所有的应用场合我们都直接使用 ApplicationContext 而非底层的 BeanFactory

  • BeanFactory

    BeanFactory主要的就是getBean方法获取Bean,接口本身并不关心获取的具体过程,就像我们只关心工厂能生产出什么产品,至于是如何生产,使用什么原料并不重要,因此这个基础的接口就达到了基础容器定义的目的。

  • 体系结构图
    这里写图片描述

  • 说明:

1.AutowireCapableBeanFactory:定义了容器中的Bean 按具体的规则(名称,类型)自动装配的方法;

2.HierachicalBeanFactory:父子级联IOC容器接口,子容器可以根据该接口访问父容器;

3.ListableBeanFactory:定义了访问bean的基本方法,改接口实现通常会加载所有在配置文件中定义的bean;

4.BeanDefinitionRegistry:Spring 配置文件中每一个节点元素在 Spring 容器里都通过一个 BeanDefinition
对象表示,它描述了 Bean 的配置信息。而 BeanDefinitionRegistry 接口提供了向容器手工注册 BeanDefinition 对象的方法;

5.ConfigurableBeanFactory:是一个重要的接口,增强了 IoC 容器的可定制性,它定义了设置类装载器、属性编辑器、容器初始化后置处理器等方法;

我们可以看到DefaultListableBeanFactory除了具备BeanFactory的功能,它还实现了SingletonBeanRegistry接口,也就是Bean在Spring中的存储器,相当于Spring中Bean的内存数据库。它除了缓存Bean实例还缓存了Bean定义,这对于后续执行Bean处理器非常有用。

  • ApplicationContext

    ApplicationContext 由 BeanFactory 派生而来,提供了更多面向实际应用的功能。在BeanFactory 中,很多功能需要以编程的方式实现,而在 ApplicationContext 中则可以通过配置的方式实现。

  • 体系结构图
    这里写图片描述
    由图可知,ApplicationContext 继承了 HierarchicalBeanFactory 和 ListableBeanFactory 接口,在此基础上,还通过多个其他的接口扩展了 BeanFactory 的功能:

  • ClassPathXmlApplicationContext:默认从类路径加载配置文件;
  • FileSystemXmlApplicationContext:从文件系统中状态配置文件;
  • ApplicationEventPublisher:让容器具有上下文事件功能,包括容器启动事件、关闭事件等。实现了 ApplicationListener 事件监听接口的 Bean 可以接收到容器事件 , 并对事件进行响应处理 。 在 ApplicationContext 抽象实现类AbstractApplicationContext 中,我们可以发现存在一个 ApplicationEventMulticaster,它负责保存所有监听器,以便在容器产生上下文事件时通知这些事件监听者;
  • MessageSource:为应用提供 i18n 国际化消息访问的功能;
  • ConfigurableApplicationContext 扩展于 ApplicationContext,它新增加了两个主要的方法: refresh()和 close(),让 ApplicationContext 具有启动、刷新和关闭应用上下文的能力。在应用上下文关闭的情况下调用 refresh()即可启动应用上下文,在已经启动的状态下,调用 refresh()则清除缓存并重新装载配置信息,而调用close()则可关闭应用上下文。这些接口方法为容器的控制管理带来了便利,但作为开发者,我们并不需要过多关心这些方法。

Bean的创建和获取流程

  • beanFactory 管理Bean

    • bean的创建
    • bean的存储
    • bean的获取
    • 依赖关系管理
    • 自动生成bean
  • beanDefinition 定义Bean

    • 定义bean属性(BeanDefinition):id,name,scope(单例(默认),多例),class,parent(继承),lazyInit,property,depends

    • 存储bean(XmlBeanDefinitionReader):xml,properties方式

  • BeanDefinitionReader 加载解析bean

    • 加载xml文件——> 转换成Document——>解析Document element到BeanDefinition(BeanDefinitionDocumentReader)——>注册bean(BeanDefinitionRegistry)

依赖注入的实现逻辑

实现过程可分为:加载和注册Bean、 创建Bean、依赖注册、单例缓存等

  • 实现流程图
    这里写图片描述

Bean的生命周期

bean的生命周期主要有四个阶段:实例化,初始化,使用,销毁,具体流程如图:
这里写图片描述

由图可以看出来,在调用getBean()方法时,获取一个Bean之前需要经历执行初始化之前的逻辑,设置属性,设置方法,执行完成初始化后的动作然后将singleton的Bean放到缓冲池中,非singleton的就返回给client使用。在整个生命周期中BeanPostProcessor都扮演着重要的作用,事实上一个Bean在容器中需要经历哪些生命周期基本上由容器注册了哪些BeanPostProcessor来决定。

参考地址


发布了91 篇原创文章 · 获赞 27 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/xhwwc110/article/details/79619963