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. zookeeper 下载安装

      下载:wget https://www-us.apache.org/dist/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz 解压:tar -zx ...

    2. 编译php 转

      LAOGAO added 20140907: configure: error: mcrypt.h not found. Please reinstall libmcrypt.复制代码 代码如下:wg ...

    3. mysql-Innodb事务隔离级别-repeatable read详解

      http://blog.csdn.net/dong976209075/article/details/8802778 经验总结: Python使用MySQLdb数据库后,如使用多线程,每个线程创建一个 ...

    4. 如何获取JavaCard剩余空间

      0x01应用场景 获取JavaCard卡内剩余空间,一方面是在评估一张卡的时候需要用到,另一方面是在应用个人化或者运行时需要用到. 例如:应用提供商为了保证自己的应用在卡内运行期间能够不受空间影响,一 ...

    5. 大素数判断和素因子分解(miller-rabin,Pollard_rho算法)

      #include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #in ...

    6. BZOJ2395 [Balkan 2011]Timeismoney 【最小乘积生成树】

      题目链接 BZOJ2395 题意:无向图中每条边有两种权值,定义一个生成树的权值为两种权值各自的和的积 求权值最小的生成树 题解 如果我们将一个生成树的权值看做坐标,那么每一个生成树就对应一个二维平面 ...

    7. oracle存储过程、声明变量、for循环

      oracle存储过程.声明变量.for循环  1.创建存储过程 create or replace procedure test(var_name_1 in type,var_name_2 out t ...

    8. bzoj2115【WC2011】XOR

      题意:http://www.lydsy.com/JudgeOnline/problem.php?id=2115 sol  :首先考虑处理出DFS树,那么树上的所有非树边可以构成一个简单环 因为所有不在 ...

    9. 数位DP毕业题

      原题 题意 给一个 $64$ 位的二进制数,求小于这个数的回文二进制数的数量. 题解 加强版 题意 同上,但允许一个数最多有 $k$ 位不是回文(即把任意 $k$ 位取反后这个数是一个回文数),这种数 ...

    10. 用 config drive 配置网络

      上一节最后问了大家一个问题:如果 subnet 没有开 DHCP,会是怎样一个情况? 在其他条件不变的情况下,cloud-init 依然会完成那 3 个步骤,也就是说网卡还是会被配置成 dhcp 模式 ...