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. [问题解决]NotImplementedError 错误原因:子类没有实现父类要求一定要实现的接口

      NotImplementedError: 子类没有实现父类要求一定要实现的接口. 在面向对象编程中,父类中可以预留一个接口不实现,要求在子类中实现.如果一定要子类中实现该方法,可以使用raise No ...

    2. Android之操作相册

      获取手机中的图片的绝对路径并且区分出每个文件夹下的路径: 存放图片绝对路径的文件夹的名字和存放绝对路径的List 实体类如下: import java.util.ArrayList; import j ...

    3. 基于 Spring 和 iBATIS 的动态可更新多数据源持久层

      前言 我们时常会遇到一些 web 项目,需要从不同的数据源中抓取数据来进行分析,而这些数据源是有可能变化的,需要用户来进行动态的维护和添加.可是,大多数的 web 程序使用了应用服务器或者容器中间件来 ...

    4. iis特殊后缀文件下载404

      项目中有特殊类型的文件上传到服务器,下载的时候报404,下载不下来.如后缀名为qwwq这种类型. 因为遇到过这种情况,以前都是配置mime类型好的,但是这次没有找到,到底应该配置什么mime类型,一时 ...

    5. mybatis经验

    6. Hadoop入门第四篇:手动搭建自己的hadoop小集群

      前言 好几天没有更新了,本来是应该先写HDFS的相关内容,但是考虑到HDFS是我们后面所有学习的基础,而我只是简单的了解了一下而已,后面准备好好整理HDFS再写这块.所以大家在阅读这篇文章之前,请先了 ...

    7. [BZOJ2456] mode(一道很有意思的题)

      传送门 看到这个题的第一反应是离散化+线段树乱搞.. eeeeeeeeeeee感觉数据结构学傻了,其实直接存下来,sort一遍,n/2的位置的就是答案 当然前提是空间够的话 1m的空间连数组都开不下 ...

    8. python和tensorflow安装

      一.Python安装 python采用anaconda安装,简单方便,下载python3.6的anaconda  linux64的sh安装文件. 1.bash Anaconda-2.1.0-Linux ...

    9. 【CF1068C】Colored Rooks(构造)

      题意: 思路: #include<cstdio> #include<cstring> #include<string> #include<cmath> ...

    10. Replacing Accented characters(Diacritic) .NET

      原文发布时间为:2012-02-17 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Collections.Generic;using Syste ...