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. 获取完整的URL request.getQueryString()

      public String codeToString(String str) { String strString = str; try { byte tempB[] = strString.getB ...

    2. hdu 4183 EK最大流算法

      欢迎参加——每周六晚的BestCoder(有米!) Pahom on Water Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 327 ...

    3. 光线追踪(raytracing)

      光线追踪(raytracing) 题目描述 考虑一个二维平面,摄像机在(0,0)(0,0)的位置,初始时平面上没有障碍物.现在执行QQ次操作,操作有两种(假设这是第ii次操作,1≤i≤Q1≤i≤Q): ...

    4. C# 获取NTP远程同步时间

      收到一个需要定时同步远程服务器的需求,用C# 实现 网上搜索到解决方案,代码如下: 获取远程时间 参数配置:"NTPServer"  远程时间服务器地址 获取远程服务器时间代码: ...

    5. Mysql EXISTS NOT EXISTS

      SELECT c.CustomerId, CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID FROM Orders o WHERE o ...

    6. BZOJ 3876 支线剧情

      支线剧情 [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往都有很多的支线剧情,现在JYY想花费最 ...

    7. [转].net创建XML文件的两种方法

      原文发布时间为:2009-08-26 -- 来源于本人的百度文章 [由搬家工具导入] 方法一:按照XML的结构一步一步的构建XML文档.    通过.Net FrameWork SDK中的命名空间&q ...

    8. Eclipse配置关联Tomcat并运行项目

      打开Eclipse,单击“Window”菜单,选择最下方的“Preferences”. 单击“Server”选项,选择下方的“Runtime Environments”. 点击“Add”添加Tomca ...

    9. [LeetCode] Permutations II 排列

      Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

    10. linux下的程序调试方法汇总

      搞电子都知道,电路不是焊接出来的,是调试出来的.程序员也一定认同,程序不是写出来的,是调试出来的.那么调试工具就显得尤为重要,linux作为笔者重要的开发平台,在linux中讨论调试工具主要是为那些入 ...