Spring IOC源码详解之总体结构

Spring ICO详解之总体结构

IOC介绍

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

开启Spring IOC源码学习

SpringIOC 的主要依赖源码是 spring-beans 和 spring-context两个包。前面文章中曾今讲到了如何编译spring源码,接下来将maven后的工程导入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容器初始化源码

  • 版权声明:本文为博主原创文章,未经博主允许不得转载。

    时间: 2024-10-11 07:12:43

    Spring IOC源码详解之总体结构的相关文章

    Spring IOC源码详解之容器依赖注入

    Spring IOC源码详解之容器依赖注入 上一篇博客中介绍了IOC容器的初始化,通过源码分析大致了解了IOC容器初始化的一些知识,先简单回顾下上篇的内容 载入bean定义文件的过程,这个过程是通过BeanDefinitionReader来完成的,其中通过 loadBeanDefinition()来对定义文件进行解析和根据Spring定义的bean规则进行处理 - 事实上和Spring定义的bean规则相关的处理是在BeanDefinitionParserDelegate中完成的,完成这个处理需

    Spring IOC源码详解之容器初始化

    Spring IOC源码详解之容器初始化 上篇介绍了Spring IOC的大致体系类图,先来看一段简短的代码,使用IOC比较典型的代码 ClassPathResource res = new ClassPathResource("beans.xml"); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDe

    Shiro 登录认证源码详解

    Shiro 登录认证源码详解 Apache Shiro 是一个强大且灵活的 Java 开源安全框架,拥有登录认证.授权管理.企业级会话管理和加密等功能,相比 Spring Security 来说要更加的简单. 本文主要介绍 Shiro 的登录认证(Authentication)功能,主要从 Shiro 设计的角度去看这个登录认证的过程. 一.Shiro 总览 首先,我们思考整个认证过程的业务逻辑: 获取用户输入的用户名,密码: 从服务器数据源中获取相应的用户名和密码: 判断密码是否匹配,决定是否

    Android编程之Fragment动画加载方法源码详解

    上次谈到了Fragment动画加载的异常问题,今天再聊聊它的动画加载loadAnimation的实现源代码: Animation loadAnimation(Fragment fragment, int transit, boolean enter, int transitionStyle) { 接下来具体看一下里面的源码部分,我将一部分一部分的讲解,首先是: Animation animObj = fragment.onCreateAnimation(transit, enter, fragm

    Java concurrent AQS 源码详解

    一.引言 AQS(同步阻塞队列)是concurrent包下锁机制实现的基础,相信大家在读完本篇博客后会对AQS框架有一个较为清晰的认识 这篇博客主要针对AbstractQueuedSynchronizer的源码进行分析,大致分为三个部分: 静态内部类Node的解析 重要常量以及字段的解析 重要方法的源码详解. 所有的分析仅基于个人的理解,若有不正之处,请谅解和批评指正,不胜感激!!! 二.Node解析 AQS在内部维护了一个同步阻塞队列,下面简称sync queue,该队列的元素即静态内部类No

    深入Java基础(四)--哈希表(1)HashMap应用及源码详解

    继续深入Java基础系列.今天是研究下哈希表,毕竟我们很多应用层的查找存储框架都是哈希作为它的根数据结构进行封装的嘛. 本系列: (1)深入Java基础(一)--基本数据类型及其包装类 (2)深入Java基础(二)--字符串家族 (3)深入Java基础(三)–集合(1)集合父类以及父接口源码及理解 (4)深入Java基础(三)–集合(2)ArrayList和其继承树源码解析以及其注意事项 文章结构:(1)哈希概述及HashMap应用:(2)HashMap源码分析:(3)再次总结关键点 一.哈希概

    深入Spring IOC源码之ResourceLoader

    在<深入Spring IOC源码之Resource>中已经详细介绍了Spring中Resource的抽象,Resource接口有很多实现类,我们当然可以使用各自的构造函数创建符合需求的Resource实例,然而Spring提供了ResourceLoader接口用于实现不同的Resource加载策略,即将不同Resource实例的创建交给ResourceLoader来计算. public interface ResourceLoader { //classpath String CLASSPAT

    IntentService源码详解

    IntentService可以做什么: 如果你有一个任务,分成n个子任务,需要它们按照顺序完成.如果需要放到一个服务中完成,那么IntentService就会使最好的选择. IntentService是什么: IntentService是一个Service(看起来像废话,但是我第一眼看到这个名字,首先注意的是Intent啊.),所以如果自定义一个IntentService的话,一定要在AndroidManifest.xml里面声明. 从上面的"可以做什么"我们大概可以猜测一下Inten

    Android View 事件分发机制源码详解(View篇)

    前言 在Android View 事件分发机制源码详解(ViewGroup篇)一文中,主要对ViewGroup#dispatchTouchEvent的源码做了相应的解析,其中说到在ViewGroup把事件传递给子View的时候,会调用子View的dispatchTouchEvent,这时分两种情况,如果子View也是一个ViewGroup那么再执行同样的流程继续把事件分发下去,即调用ViewGroup#dispatchTouchEvent:如果子View只是单纯的一个View,那么调用的是Vie