BeanFactory

上一章中,我们提过Spring的依赖注入容器是BeanFactory。BeanFactory是一个基础接口,它有一个默认实现类:DefaultListableBeanFactory。我们可以由它为出发点看看Spring的类层次结构。如下图所示:

        上图中,有一个值得我们学习的设计方法。DefaultListableBeanFactory类实现了ConfigurableListableBeanFactory接口。然后ConfigurableListableBeanFactory继承了接口ListableBeanFactory、AutowireCapableBeanFactory、ConfigurableBeanFactory三个接口。但是DefaultListableBeanFactory类只专注实现ListableBeanFactory接口,其它的实现交给它的继承父类AbstractAutowireCapableBeanFactory。这样的设计思路在Spring代码类中随处可见。
        从图中我们可以看到BeanFactory有三个直接子接口: AutowireCapableBeanFactory、HierarchicalBeanFactory、ListableBeanFactory。如下图:

ApplicationContext

上面整个是BeanFactory部分的类层次结构。但是我们在使用Spring的过程中,经常接触的是ApplicationContext。ApplicationContext是由BeanFactory派生而来,除具有BeanFactory的所有功能之外,还具有资源访问、国际化处理、强大的事件机制。
        在这里着重介绍一下ApplicationContext的事件机制。它是通过ApplicationEvent和ApplicationListner这两个接口来提供的。当ApplicationContext中发布一个事件时,所有扩展ApplicatonListener的Bean都将会接受这个事件,并进行相应的处理。
Spring提供了部分内置事件,主要有以下几种:
        ContextRefreshedEvent:ApplicationContext发送该事件时,表示该容器中所有的Bean都已经被装载完成,此ApplicationContext已就绪可用。
        ContextStartedEvent:生命周期beans的启动信号
        ContextStoppedEvent:生命周期beans的停止信号
        ContextClosedEvent:ApplicationContext关闭事件,则context不能刷新和重启,从而所有的singleton bean全部销毁。

好了,还是让我们来看看ApplicationContext的类层次结构,如下图所示:


        从图中可以看出,ApplicationContext采用继承结构,每层完成特定的工作。通过源码可以知道,Spring启动ApplicationContext容器的主要逻辑放在AbstractApplictionContext类的refresh方法中。Refresh方法应该是我们理解代码的大纲及难点。
        请仔细查看并认真记忆以上两个UML图,在下一章,我准备剖析重点剖析refresh方法。

 
0

Spring源码由浅入深系列二 类结构的更多相关文章

  1. Spring源码由浅入深系列一 简介

    概述: Spring是一个企业级的开源框架.它提供轻量级的依赖注入.面向切面编程.全方位的整合框架.下图是Spring框架的组成部分,各部分内容作了简单说明. 依赖注入:         依赖注入是S ...

  2. Spring源码由浅入深系列三 refresh

    spring中的refresh是一个相当重要的方法.它完成IOC的第一个阶段,将xml中的bean转化为beanDefinition.详细说明如上图所示. 在上图中,创建obtainFreshBean ...

  3. Spring源码由浅入深系列六 CreateBean过程

  4. Spring源码由浅入深系列五 GetBean

    获取bean的过程如上图所示.下一章将继续图示讲解createBean的过程.

  5. Spring源码由浅入深系列四 创建BeanFactory

    继上一章refresh之后,上图描述了obtainFreshBeanFactory过程.

  6. spring源码分析系列 (1) spring拓展接口BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor

    更多文章点击--spring源码分析系列 主要分析内容: 一.BeanFactoryPostProcessor.BeanDefinitionRegistryPostProcessor简述与demo示例 ...

  7. spring源码分析系列 (3) spring拓展接口InstantiationAwareBeanPostProcessor

    更多文章点击--spring源码分析系列 主要分析内容: 一.InstantiationAwareBeanPostProcessor简述与demo示例 二.InstantiationAwareBean ...

  8. spring源码分析系列 (2) spring拓展接口BeanPostProcessor

    Spring更多分析--spring源码分析系列 主要分析内容: 一.BeanPostProcessor简述与demo示例 二.BeanPostProcessor源码分析:注册时机和触发点 (源码基于 ...

  9. Spring源码解析系列汇总

    相信我,你会收藏这篇文章的 本篇文章是这段时间撸出来的Spring源码解析系列文章的汇总,总共包含以下专题.喜欢的同学可以收藏起来以备不时之需 SpringIOC源码解析(上) 本篇文章搭建了IOC源 ...

随机推荐

  1. Shiro学习(18)并发人数限制

    在某些项目中可能会遇到如每个账户同时只能有一个人登录或几个人同时登录,如果同时有多人登录:要么不让后者登录:要么踢出前者登录(强制退出).比如spring security就直接提供了相应的功能:Sh ...

  2. Delphi 实现简易语音发音(基于TTS方式)

    uses Comobj; procedure TForm1.Button1Click(Sender: TObject); var voice: OLEVariant; begin voice := C ...

  3. Apache解析漏洞复现(CVE-2017-15715),可以绕过黑名单

    照着P神的文章准备复现一下(总结一下经验) 环境的安装 这里面直接使用的vulhub里面的环境来进行安装的(为了方便吗) 基础环境如下    实际上Apache版本在2.4.0~2.4.29即可 i ...

  4. thinkphp5选择redis库,让数据存入不同的redis库

    thinkphp5选择redis库,让数据存入不同的redis库 在登录的时候把个人信息存入redis,选择redis库1号库, db1 读取redis里面的个人信息

  5. 堆、栈、方法区、静态代码块---Java

    java 堆.栈.方法区 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基 ...

  6. 1.3 React 组件

    1.3.1 React 组件介绍 在 React 中组件是第一元素,是 React 的基础,一个 React 应用就是基于 React 组件的组合而成.前面的 JSX 练习过后,大家应该对 React ...

  7. ISA虚拟化的条件

    ISA(Instruction Set Architecture) 指令集体系结构,是硬件与软件层之间的接口. 本地系统虚拟机 本地系统虚拟机,就是Bare-Metal虚拟机,直接运行在硬件上,在它上 ...

  8. 拾遗:编译安装 vim

    在非 Gentoo/Funtoo 系的 Linux 发行版上,软件仓库里的 vim 包可能没有加入 python 特性支持,会造成部分插件无法正常使用 一.下载 vim 源码包 ftp://ftp.v ...

  9. MFS分布式文件系统【1】概述

    注:以下内容来自互联网 MFS文件系统概论 MFS是linux下的开源存储系统,是由波兰人开发的.MFS文件系统能够实现RAID的功能,不但能够节约存储成本,而且不逊于专业的存储系统,能够实现在线扩展 ...

  10. CDH5..4.7+phoenix实现查询HBase异常:java.sql.SQLException: ERROR 1102 (XCL02): Cannot get all table regions

    基础环境是用CM 安装的cdh5.4.7,phoenix使用的版本是phoenix-4.5.2-HBase-1.0-bin. 出现异常信息:java.sql.SQLException: ERROR 1 ...