signed

QiShunwang

“诚信为本、客户至上”

一步一步探究Spring源码之IOC(一)

2021/4/26 13:34:08   来源:

Spring源码之IOC

文章目录

    • Spring源码之IOC
      • 1、概述
        • 1.1、容器
        • 1.2、DI(依赖注入)
      • 2、架构
        • 2.1、核心内作用说明
        • 2.2、主要流程图

1、概述

    IOC–Inversion Of Control,即控制反转,是一种设计思想。该思想主要包含两个方面,由顶层控制类统一管理对象的生命周期和对象与对象之间的依赖,降低了耦合度,并让用户无需花费精力去管理对象。控制:控制对象的产生及依赖的入口,反转:对象的产生由开发者产生变为顶层产生,由主动变为了被动。IOC引申出两个概念:容器、依赖注入。

1.1、容器

    容器:存放东西的器皿,把东西全部放到这个器皿里面,当需要使用的时候就去器皿里面拿出来,用完之后再还回到器皿里。像大家比较熟悉的数据库的连接池也可以看作是一个容器,所有数据库连接都会放到一个池子里面,当需要用到连接时就去池子里面拿一个,不用了再还回去,使用者不需要关注连接的管理,只需要拿和还两个动作。而在IOC容器也可类比连接池,容器负责对象的实例化、初始化等,它管理整个对象的生命周期,所有对象都存放在容器当中,如果需要使用对象则从容器中拿,使用者无需关注对象生命周期的管理。

1.2、DI(依赖注入)

    DI:Dependency Injection 依赖注入,对象之间的依赖关系由容器运行时决定,应用程序的运行依赖于IOC容器,其运行时依赖的对象也是通过IOC容器动态的注入。比如对象A需要操作数据库,传统方式需要在A中自己编写代码来获得一个Connection对象,有了IOC容器之后,只需要告诉IOC容器A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,IOC容器会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由IOC容器注入到A中的。

在研究IOC源码之前需要去了解java的反射机制,IOC底层是通过反射实现的

2、架构

IOC容器架构图

2.1、核心内作用说明

  • BeanDefinition:描述了一个bean实例信息,该实例具有属性值,构造函数参数值以及具体实现所提供的更多信息。Spring IOC容器会从Bean配置信息(xml或者注解)中解读定义的bean信息,将bean的属性、构造函数、初始化方法、销毁方法、父类等信息解读成一个BeanDefinition对象,最终交由IOC容器去进行实例化。
  • BeanDefinitionReader:BeanDefinition对象解读器,专门负责将Bean配置信息(xml或者注解)中定义的Bean解读成BeanDefinition对象。
  • BeanFactory:用于访问Spring bean容器的根接口,是一个Bean工厂类,定义了一个Bean工厂的基本规范,具体工厂如何工作由其子类实现。简单点可以理解为IOC容器相关的类基本都是BeanFactory的子类,最终通过它去访问IOC容器中的相关内容
  • ApplicationContext:通用Spring上下文容器(IOC容器),
  • BeanFactoryPostProcessor:BeanFactory后置处理器,存在多个不同类型的后置处理器,主要作用于修改BeanFactory中BeanDefinition。常用的例如ConfigurationClassPostProcessor,该后置处理器会去解析@Component(@COntroller、@Service等)、@ComponentScan、@Import等注解,将标注这些注解的Bean全部解析并包装成BeanDefinition对象,存入BeanFactory的beanDefinitionMap中。另外还有一个大家熟知的情况也是通过BeanFactory的后置处理器进行处理的,xml文件中的占位符属性赋值是在此阶段将占位符对应的值解析到beanFactory的字符解析器中(List embeddedValueResolvers),等待Bean初始化再赋值。
  • BeanPostProcessor:Bean后置处理类,像BeanFactoryPostProcessor一样存在多个,但是其主要作用于修改正在初始化的Bean(例如修改Bean的某一属性值或者加载某一个东西可以通过该后置处理器进行修改)。BeanPostProcessor在bean的init方法执行前后皆可起作用,

2.2、主要流程图

IOC容器启动流程图