19

『互联网架构』软件架构-spring源码之spring ioc(九)

 5 years ago
source link: https://idig8.com/2019/02/15/hulianwangjiagouruanjianjiagou-springyuanmazhispring-iocjiu/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

上次说了spring的体系结构和概要大概有那些模块,spring ioc是最核心最原始的一个框架,其实就是spring的老本,spring就是依靠着ioc,慢慢发展到其他Data,web,AOP上的。记得当初项目里面使用spring的时候,就知道配置个xml,在struts2上引用spring配置的bean,引用这个类就可以直接用了,不用直接new了,完全不管原理,确实方便但是需要配置2次,一次是spring bean.xml,一次是struts引用的时候配置。这次主要看看spring IOC底层是如何实现的。

zUnuiy7.png!web

Spring IOC

IOC容器的组成和体系架构

  • 什么是IOC

    IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。 说白了就是管理bean(Bean的创建,Bean的存储,Bean的获取)。

  • BeanFactory

    BeanFactory是最基本的IOC容器接口,这个接口为具体的IOC容器的实现作了最基本的功能规定。

jaAnMb7.png!web

BeanFactory类结构体系

BBjiQbf.png!web

BeanFactory的源码解析

public interface BeanFactory {

    //这里是对FactoryBean的转义定义,因为如果使用bean的名字检索    FactoryBean得到的对象是工厂生成的对象,  
    //如果需要得到工厂本身,加上“&”
    String FACTORY_BEAN_PREFIX = "&";

    //根据bean的名字,在IOC容器中得到bean实例
    Object getBean(String name) throws BeansException;

    //根据bean的名字和Class类型来得到bean实例,若根据名字取得的bean实例的Class类型和需要的不同的话
    //会抛出异常
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;

    //根据指定的类型取得IoC容器中管理的Bean
    <T> T getBean(Class<T> requiredType) throws BeansException;

    //重载了getBean(String name)方法,可变参数用来指定构造方法或者工厂方法需要的参数
    //覆盖之前已经在bean中定义好的参数
    Object getBean(String name, Object... args) throws BeansException;

    //重载了getBean(Class<T> requiredType)方法,可变参数用来指定构造方法或者工厂方法需要的参数
    //覆盖之前已经在bean中定义好的参数
    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

    //判断在IOC容器是否 有这个名字的bean
    boolean containsBean(String name);

    //查询指定名字的Bean是否是单态类型(singleton)
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

    //查询指定名字的Bean是否是原型(prototype)类型
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

    //查询指定名字的Bean的class类型是否支持特定的class类型
    boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;

    //查询指定名字的Bean的class类型
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;

    //查询指定名字的Bean的所有别名
    String[] getAliases(String name);

}

beanFactroy 对bean的实例化过程

spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说,

DefaultListableBeanFactory 是整个spring ioc的始祖,研究透它的前生今世对我们理解spring ioc的概念有着重要的作用。 Spring Bean的创建是典型的工厂模式,这一系列的Bean工厂,也即IOC容器为开发者管理对象间的依赖关系提供了很多便利和基础服务,在Spring中有许多的IOC容器的实现供用户选择和使用,其相互关系如下:

z2Qv6bB.png!web

  • 管理Bean
  1. Bean的创建
  2. Bean的存储
  3. Bean的获取
  4. 自动完成依赖的检测和注入
  5. 自动生成Bean

Beandefinition的定义组成

富士康的苹果手机,研发都是美国那边统一来进行的。也就是说富士康工厂本身是不会定义咱们的苹果手机的,都是由美国的研发对苹果手机进行定义,然后富士康对手机进行生产,存储,运输。苹果手机就类似咱们的bean。

  • Bean属性的定义
  1. name
  2. id
  3. scope(单例,多例)
  4. className
  5. parent
  6. lazyInt
  7. depends
  8. property
  • bean定义存储
  1. xml
  2. properties

MBr6ZjI.png!web

yqArEjE.png!web

BeandefinitionReader加载解析Bean

spring提供了有两种方式的bean definition解析器:PropertiesBeanDefinitionReader和XmLBeanDefinitionReader即属性文件格式的bean definition解析器和xml文件格式的bean definition解析器。

  1. 加载文件
  2. 转换成Document
  3. 解析注册Beandefinition

r6bmEnV.png!web

流程

  • IOC容器的构建归为以下六步
  1. 定义好Spring的配置文件。
  2. 通过Resource对象将Spring配置文件进行抽象,抽象成一个Resource对象。
    定义好Bean工厂。
  3. 定义好XmlBeanDefinitionReader对象,并将工厂作为参数传递进去供后续回调使用。
  4. 通过XmlBeanDefinitionReader对象读取之前抽象出的Resource对象(包含了XML文件的解析过程)。本质上,XML文件的解析是由XmlBeanDefinitionReader交由
  5. BeanDefinitionParserDelegate委托来完成(用到了委托模式)
  6. IoC容器创建完毕,用户可以通过容器获取到所需的对象信息。
  • 简化版流程
  1. 装载BeanDefinition到beanfactroy中
  2. 获取bean的时候去getBeanDefinition
  3. 然后createBean

流程图

zEBfyij.png!web

e6ZnMzb.png!web

Z3uIFju.png!web

IOC容器全部的体系结构

vaY7BzM.png!web

PS:读源码确实很麻烦,但是spring的源码大概120多MB,相当于一个JAVA的JDK了,读了怼咱们日常开发真的很有用,设计到的模式:单例模式,工厂模式,建造者模式。

百度未收录

>>原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!

>>原文链接地址:上一篇:

已是最新文章


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK