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

栏目: Java · 发布时间: 5年前

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

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

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

Spring IOC

IOC容器的组成和体系架构

  • 什么是IOC

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

  • BeanFactory

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

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

BeanFactory类结构体系

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

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容器的实现供用户选择和使用,其相互关系如下:

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

  • 管理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

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

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

BeandefinitionReader加载解析Bean

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

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

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

流程

  • 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

流程图

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

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

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

IOC容器全部的体系结构

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

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

百度未收录

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

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

已是最新文章


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Bulletproof Web Design

Bulletproof Web Design

Dan Cederholm / New Riders Press / 28 July, 2005 / $39.99

No matter how visually appealing or packed with content a Web site is, it isn't succeeding if it's not reaching the widest possible audience. Designers who get this guide can be assured their Web site......一起来看看 《Bulletproof Web Design》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具