Spring ICO具体解释之整体结构

IOC介绍

IOC, spring的核心。贯穿Spring始终。直观的来说。就是由spring来负责控制对象的生命周期和对象间的关系,将对象之间的关系抽象出来。通过spring容器控制对象生成时机,降低对象之间的耦合度。

开启Spring IOC源代码学习

SpringIOC 的主要依赖源代码是 spring-beans 和 spring-context两个包。前面文章中曾今讲到了怎样编译spring源代码,接下来将maven后的project导入eclipse里面。

一、spring IOC 中的Beanfactory

在Spring中,最主要的IOC容器接口是BeanFactory 。这个接口为详细的IOC容器的实现作了最主要的功能规定, 看例如以下类图,体现了Beanfactory的体系结构




当中BeanFactory作为最顶层的一个接口类,它定义了IOC容器的基本功能规范。

  • BeanFactory 有三个子类:ListableBeanFactory、HierarchicalBeanFactory 和AutowireCapableBeanFactory。
    可是从上图中我们能够发现终于的默认实现类是 DefaultListableBeanFactory。他实现了全部的接口。

    那为何要定义这么多层次的接口呢?查阅这些接口的源代码和说明发现。每一个接口都有他使用的场合,它主要是为了区分在 Spring 内部在操作过程中对象的传递和转化过程中。对对象的数据訪问所做的限制。

    比如 ListableBeanFactory 接口表示这些 Bean 是可列表的。而 HierarchicalBeanFactory 表示的是这些 Bean 是有继承关系的,也就是每一个Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定义 Bean 的自己主动装配规则。

    这四个接口共同定义了
    Bean 的集合、Bean 之间的关系、以及 Bean 行为.

    再来看看Beanfactory源代码


    public interface BeanFactory { //这里是对FactoryBean的转义定义,由于假设使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,
    //假设须要得到工厂本身。须要转义
    String FACTORY_BEAN_PREFIX = "&"; 这里依据bean的名字。在IOC容器中得到bean实例,这个IOC容器就是一个大的抽象工厂。 Object getBean(String name) throws BeansException; //这里依据bean的名字和Class类型来得到bean实例,和上面的方法不同在于它会抛出异常:假设依据名字取得的bean实例的Class类型和须要的不同的话。 Object getBean(String name, Class requiredType) throws BeansException; //这里提供对bean的检索。看看是否在IOC容器有这个名字的bean
    boolean containsBean(String name); //这里依据bean名字得到bean实例。并同一时候推断这个bean是不是单件
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException; //这里对得到bean实例的Class类型
    Class getType(String name) throws NoSuchBeanDefinitionException; //这里得到bean的别名。假设依据别名检索,那么其原名也会被检索出来
    String[] getAliases(String name); }

    二、Spring IOC中的Beandefinition

    SpringIOC容器管理了我们定义的各种Bean对象及其相互的关系。Bean对象在Spring实现中是以BeanDefinition来描写叙述的,其继承体系例如以下类图

    三、spring IOC解析中BeandefinitionReader

    Bean 的解析过程非常复杂,功能被分的非常细,由于这里须要被扩展的地方非常多,必须保证有足够的灵活性,以应对可能的变化。Bean 的解析主要就是对 Spring 配置文件的解析。

    这个解析过程主要通过下图中的类完毕:

    正如图中所说,XmlBeanDefinitionReader 和DefaultBeanDefinitionDocumentReader 有关系,是由于XmlBeanDefinitionReader中有一个DefaultBeanDefinitionDocumentReader,而不是xml跟default有继承关系

    四、spring IOC中的ApplicationContext体系结构

    ApplicationContext系列容器或许是我们最熟悉的,由于web项目中使用的XmlWebApplicationContext就属于这个继承体系,还有ClasspathXmlApplicationContext等。其继承体系例如以下图所看到的:

    上面的四部分类图,算是spring IOC中最最核心的类图。理清了这四个类图,就基本能对整个ICO使用流程有一些大致了解。以下将分析IOC容器初始化源代码

  • Spring IOC源代码具体解释之整体结构的更多相关文章

    1. Spring IOC源代码具体解释之容器初始化

      Spring IOC源代码具体解释之容器初始化 上篇介绍了Spring IOC的大致体系类图,先来看一段简短的代码,使用IOC比較典型的代码 ClassPathResource res = new C ...

    2. Spring IOC源代码具体解释之容器依赖注入

      Spring IOC源代码具体解释之容器依赖注入 上一篇博客中介绍了IOC容器的初始化.通过源代码分析大致了解了IOC容器初始化的一些知识.先简单回想下上篇的内容 加载bean定义文件的过程.这个过程 ...

    3. 做一个合格的程序员之浅析Spring AOP源代码(十八) Spring AOP开发大作战源代码解析

      事实上上一篇文章价值非常小,也有反复造轮子的嫌疑,网上AOP的实例非常多,不胜枚举,事实上我要说的并非这个,我想要说的就是上一节中spring的配置文件: 我们这边并没实用到我们上几节分析的哪几个AO ...

    4. Spring的IOC原理[通俗解释一下]

      Spring的IOC原理[通俗解释一下] 1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图 ...

    5. 利用递归,反射,注解等,手写Spring Ioc和Di 底层(分分钟喷倒面试官)了解一下

      再我们现在项目中Spring框架是目前各大公司必不可少的技术,而大家都知道去怎么使用Spring ,但是有很多人都不知道SpringIoc底层是如何工作的,而一个开发人员知道他的源码,底层工作原理,对 ...

    6. Spring框架系列(6) - Spring IOC实现原理详解之IOC体系结构设计

      在对IoC有了初步的认知后,我们开始对IOC的实现原理进行深入理解.本文将帮助你站在设计者的角度去看IOC最顶层的结构设计.@pdai Spring框架系列(6) - Spring IOC实现原理详解 ...

    7. 【初探Spring】------Spring IOC(三):初始化过程---Resource定位

      我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ...

    8. 【初探Spring】------Spring IOC(一)

      IOC:Inversion of Control(控制反转).IOC它所体现的并不是一种技术,而是一种思想,一种将设计好的对象交给容器来管理的思想.IOC的核心思想就体现在控制.反转这两个词上面,要理 ...

    9. 谈谈对Spring IOC的理解(转)

      学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

    随机推荐

    1. SEO相关

      前端需要注意哪些SEO 合理的title.description.keywords: -- 搜索对着三项的权重逐个减小,title值强调重点即可,重要关键词出现不要超过2次,而且要靠前,不同页面tit ...

    2. BZOJ 1087:[SCOI2005]互不侵犯King(状压DP)

      [SCOI2005]互不侵犯King [题目描述] 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...

    3. 【bzoj3217】ALOEXT 替罪羊树套Trie树

      题目描述 taorunz平时最喜欢的东西就是可移动存储器了……只要看到别人的可移动存储器,他总是用尽一切办法把它里面的东西弄到手. 突然有一天,taorunz来到了一个密室,里面放着一排可移动存储器, ...

    4. CCC2019游记

      好吧其实是清华游记,$CCC2019$ 在中国只有北京和天津举办,要选去加拿大的人很少,估计是最近两国关系有点紧张的缘故吧 但实际上是某些已经被清华钦点的人去预览一下他们未来的栖息所 $13:30$ ...

    5. 使用非对称算法RSA实现加解密和使用签名算法SHA1WithRSA、MD5withRSA生成签名以及验签

      不啰嗦,直接上源码 package com.hudai.platform.manager.util; import java.io.ByteArrayOutputStream; import java ...

    6. CODEVS【1025】选菜

      1025 选菜  时间限制: 1 s  空间限制: 128000 KB   题目等级 : 黄金 Gold 题目描述 Description 在小松宿舍楼下的不远处,有PK大学最不错的一个食堂——The ...

    7. css3 实现多行文本折行

      <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

    8. [LeetCode] Jump Game II 贪心

      Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

    9. luogu 1258 小车问题 小学奥数(?)

      题目链接 题意 甲.乙两人同时从A地出发要尽快同时赶到B地.出发时A地有一辆小车,可是这辆小车除了驾驶员外只能带一人.已知甲.乙两人的步行速度一样,且小于车的速度.问:怎样利用小车才能使两人尽快同时到 ...

    10. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---47

      以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: