前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >『互联网架构』软件架构-spring源码之spring ioc(九)

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

作者头像
IT架构圈
发布2019-03-06 14:56:25
3300
发布2019-03-06 14:56:25
举报
文章被收录于专栏:IT架构圈IT架构圈

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

Spring IOC

IOC容器的组成和体系架构
  • 什么是IOC

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

  • BeanFactory

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

BeanFactory类结构体系

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

  • 管理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
BeandefinitionReader加载解析Bean

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

  1. 加载文件
  2. 转换成Document
  3. 解析注册Beandefinition
流程
  • 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
流程图

IOC容器全部的体系结构

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程坑太多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring IOC
    • IOC容器的组成和体系架构
      • beanFactroy 对bean的实例化过程
        • Beandefinition的定义组成
          • BeandefinitionReader加载解析Bean
            • 流程
              • 流程图
              • IOC容器全部的体系结构
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档