这里主要对springIOC接口体系进行简单的概述和分析,具体每个接口详细分析在下面目录:

参考内容: <Spring技术内幕:深入解析 Spring架构与设计原理> 和 <Spring源码深度解析(第2版)>

源码查看工具: idea,spring版本5.2.0

一 主要接口设计图

idea查看接口关系图,可在图中删除新增画出自定义的关系图,使用del和查看实现类快捷键(ctrl+alt+b)点击即可删除和增加类图

二 第一条线

通过BeacFactory->HierarchicalBeanFactory->ConfigurableBeanFactory接口功能的叠加,定义了Bean容器基本的功能

1 BeacFactory定义了基本的IOC容器规范,包括getBean,判断Bean是否单例等方法,接口方法有

2 HierarchicalBeanFactory增加了获取父容器等方法,使容器具备双亲Ioc的功能,alt+7 查看当前接口的所有方法

(双亲容器: 容器可以与另一个容器进行父子容器关联。

这个时候子容器就可以引用父容器中的bean,但是父容器是不能够引用子容器中的bean的,并且各个子容器中定义的bean是互不可见的,

这样也可以避免因为不同的插件定义了相同的bean而带来的麻烦。)

3 ConfigurableBeanFactory再增加了设置父容器,设置Bean后置处理器等对Bean的配置,同时继承了SingletonBeanRegistry接口,扩展了注册访问单例Bean的功能

三 第二条线

这条线以ApplicationContext接口为核心的接口设计,开发中最常用的容器就是ApplicationContext的实现,在基本容器基础上增加了许多高级特性

1 ListableBeanFactory接口细化了许多获取Bean功能,比如获取Bean名字和数量,获取同一个class的Bean集合等

比如以下方法:

2 ApplicationContext主要增加了一些关于容器本身的一些方法,并且applicationContext通过实现

MessageSource,  ResourceLoader, ApplicationEventPublisher添加了许多高级容器支持:

3 WebApplicationContext实现了ApplicationContext接口,通常在Web环境中使用

4 ConfigurableApplicatoinContext也是ApplicationdContext的实现,

作用就是设置上下文 ID,设置父应用上下文,添加监听器,刷新容器,关闭,判断是否活跃等方法,application只定义了getId等方法

所以setId方法在子接口中定义,

refresh()方法也在这个接口中定义,IOC容器启动的主要逻辑基本都在这个方法里面,由他的实现抽象类

AbstractApplicationContext实现具体逻辑,通过封装在父抽象类中,子类容器可以直接调用,因为大部分容器初始化逻辑都是一样的,所以子容器只需要关注自身特性即可

四 核心接口详细分析

BeanFactory

ConfigurableBeanFactory

ApplicationContext

MessageSource

ListableBeanFactory

ResourceLoader

ApplicationEventPublisher

AutowireCapableBeanFactory

Environment

ConfigurableApplicationContext

WebApplicationContext

五 核心容器类详细分析

1 AbstractApplicationContext

六 特定场景详细分析

1 IOC容器启动初始化过程分析

2 解析XML文件过程分析

七 广告

最后打个广告,个人整理的所有源码xmind笔记和一些测试代码,在我的码云上面:

https://gitee.com/houzheng1216/sourcecode

笔记截图:

spring源码系列(二):IOC接口设计分析的更多相关文章

  1. Spring源码系列(二)--bean组件的源码分析

    简介 spring-bean 组件是 Spring IoC 的核心,我们可以使用它的 beanFactory 来获取所需的对象,对象的实例化.属性装配和初始化等都可以交给 spring 来管理. 本文 ...

  2. Spring源码系列(三)--spring-aop的基础组件、架构和使用

    简介 前面已经讲完 spring-bean( 详见Spring ),这篇博客开始攻克 Spring 的另一个重要模块--spring-aop. spring-aop 可以实现动态代理(底层是使用 JD ...

  3. Spring源码系列(四)--spring-aop是如何设计的

    简介 spring-aop 用于生成动态代理类(底层是使用 JDK 动态代理或 cglib 来生成代理类),搭配 spring-bean 一起使用,可以使 AOP 更加解耦.方便.在实际项目中,spr ...

  4. Spring源码分析之IOC的三种常见用法及源码实现(二)

    Spring源码分析之IOC的三种常见用法及源码实现(二) 回顾上文 我们研究的是 AnnotationConfigApplicationContext annotationConfigApplica ...

  5. Ioc容器BeanPostProcessor-Spring 源码系列(3)

    Ioc容器BeanPostProcessor-Spring 源码系列(3) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Io ...

  6. Ioc容器依赖注入-Spring 源码系列(2)

    Ioc容器依赖注入-Spring 源码系列(2) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器BeanPostPr ...

  7. 【spring源码分析】IOC容器初始化(二)

    前言:在[spring源码分析]IOC容器初始化(一)文末中已经提出loadBeanDefinitions(DefaultListableBeanFactory)的重要性,本文将以此为切入点继续分析. ...

  8. Ioc容器beanDefinition-Spring 源码系列(1)

    Ioc容器beanDefinition-Spring 源码系列(1) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器 ...

  9. 【spring源码分析】IOC容器初始化——查漏补缺(二)

    前言:在[spring源码分析]IOC容器初始化(八)中多次提到了前置处理与后置处理,本篇文章针对此问题进行分析.Spring对前置处理或后置处理主要通过BeanPostProcessor进行实现. ...

随机推荐

  1. linux下安装MariaDB数据库

    搜素某个文件:find / -name '文件名(或文件夹名)' 1.编辑yum源:vi /etc/yum.repos.d/MariaDB.repo 2.编辑文件时用到的vi命令: vi 打开一个不存 ...

  2. Apache Derby-01介绍DERBY

    1.DERBY是什么: Apache Derby 是IBM于2004年贡献给Apache软件基金会的数据库,于2005年正式成为开源项目,Derby作为一个基于JAVA的关系型数据库框架,他拥有许多便 ...

  3. Qt Quick QMl学习笔记 之图片浏览器

    Qt Quick模块是编写QML应用程序的标准库.虽然Qt QML模块提供QML引擎和语言基础结构,但Qt Quick模块提供了使用QML创建用户界面所需的所有基本类型.它提供了一个可视画布,包括用于 ...

  4. Windows To Go 企业版2019 LTSC 开发环境部署

    Windows To Go 是一项非常实用的功能,与传统方式安装Windows 10相比更具有灵活性,会根据每次接入的硬件型号保留不同版本驱动. 由于博主是一名全栈程序员(截至发稿处于菜鸟级别),对灵 ...

  5. 「HDU3823」 Prime Friend 解题报告

    Prime Friend Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. react项目使用antd

    在开始实践之前要确保搭建React单页面开发环境,如果还没有搭建好开发环境的朋友请移步到如何搭建React单页面开发环境. 首先在命令行模式下创建一个React项目(项目名使用小写字母命名):(win ...

  7. 关于knockout下拉多选值的应用

    在最近的开发过程中,应用了一些关于knockout的下拉项目. 关于下拉多选的开发在这里做一个记录. 下面直接上代码 添加的时候,无需给初始值 --viewmodel function ViewMod ...

  8. 2018 东北地区大学生程序设计竞赛(ABEHIK)

    HDU6500:Problem A. Game with string 题意: 给你一个字符串s以及它的m个子串的首尾位置,现在Alice和 Bob两个人轮流在任一子串的前面或者后面加1个字符,要求加 ...

  9. 网络流学习 - dinic

    推荐博客:https://www.cnblogs.com/SYCstudio/p/7260613.html#4246029

  10. Redis系列(二):Redis的5种数据结构及其常用命令

    上一篇博客,我们讲解了什么是Redis以及在Windows和Linux环境下安装Redis的方法, 没看过的同学可以点击以下链接查看: Redis系列(一):Redis简介及环境安装. 本篇博客我们来 ...