spring源码系列(二):IOC接口设计分析
这里主要对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实现具体逻辑,通过封装在父抽象类中,子类容器可以直接调用,因为大部分容器初始化逻辑都是一样的,所以子容器只需要关注自身特性即可
四 核心接口详细分析
ConfigurableApplicationContext
五 核心容器类详细分析
1 AbstractApplicationContext
六 特定场景详细分析
1 IOC容器启动初始化过程分析
2 解析XML文件过程分析
七 广告
最后打个广告,个人整理的所有源码xmind笔记和一些测试代码,在我的码云上面:
https://gitee.com/houzheng1216/sourcecode
笔记截图:

spring源码系列(二):IOC接口设计分析的更多相关文章
- Spring源码系列(二)--bean组件的源码分析
简介 spring-bean 组件是 Spring IoC 的核心,我们可以使用它的 beanFactory 来获取所需的对象,对象的实例化.属性装配和初始化等都可以交给 spring 来管理. 本文 ...
- Spring源码系列(三)--spring-aop的基础组件、架构和使用
简介 前面已经讲完 spring-bean( 详见Spring ),这篇博客开始攻克 Spring 的另一个重要模块--spring-aop. spring-aop 可以实现动态代理(底层是使用 JD ...
- Spring源码系列(四)--spring-aop是如何设计的
简介 spring-aop 用于生成动态代理类(底层是使用 JDK 动态代理或 cglib 来生成代理类),搭配 spring-bean 一起使用,可以使 AOP 更加解耦.方便.在实际项目中,spr ...
- Spring源码分析之IOC的三种常见用法及源码实现(二)
Spring源码分析之IOC的三种常见用法及源码实现(二) 回顾上文 我们研究的是 AnnotationConfigApplicationContext annotationConfigApplica ...
- Ioc容器BeanPostProcessor-Spring 源码系列(3)
Ioc容器BeanPostProcessor-Spring 源码系列(3) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Io ...
- Ioc容器依赖注入-Spring 源码系列(2)
Ioc容器依赖注入-Spring 源码系列(2) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器BeanPostPr ...
- 【spring源码分析】IOC容器初始化(二)
前言:在[spring源码分析]IOC容器初始化(一)文末中已经提出loadBeanDefinitions(DefaultListableBeanFactory)的重要性,本文将以此为切入点继续分析. ...
- Ioc容器beanDefinition-Spring 源码系列(1)
Ioc容器beanDefinition-Spring 源码系列(1) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器 ...
- 【spring源码分析】IOC容器初始化——查漏补缺(二)
前言:在[spring源码分析]IOC容器初始化(八)中多次提到了前置处理与后置处理,本篇文章针对此问题进行分析.Spring对前置处理或后置处理主要通过BeanPostProcessor进行实现. ...
随机推荐
- 基于 HTML5 + WebGL 的无人机 3D 可视化系统
前言 近年来,无人机的发展越发迅速,既可民用于航拍,又可军用于侦察,涉及行业广泛,也被称为“会飞的照相机”.但作为军事使用,无人机的各项性能要求更加严格.重要.本系统则是通过 Hightopo 的 ...
- windows下mysql免安装版配置(踩过的坑)简记
下载 从官网(https://dev.mysql.com/downloads/mysql/)下载 这里的免安装版本的,相对来说干净,但是需要自己来配置很多东西. 配置 首先是注册windows的服务. ...
- 「2018-12-02模拟赛」T3 约束排列 解题报告
3.约束排列(place.pas/cpp/in/out) 问题描述: 给出 n 个互不相同的小写字母,表示出现的字符类型,以及 k 个约束关系: .....,表示 ai 必须出现在 bi 前面(ai, ...
- 「USACO15FEB」Censoring (Silver) 审查(银) 解题报告
题面 就是让你--在字符串A中,如果字符串B是A的子串,那么就删除在A中第一个出现的B,然后拼接在一起,一直重复上述步骤直到B不再是A的子串 |A|\(\le 10^6\) 思路: KMP+栈 1.由 ...
- Ubuntu管理软件源
在Ubuntu环境下,我们经常会使用apt-get(apt)命令下载各种软件,当所需软件在官方软件库中找不到时,我们需要添加第三方的软件源,或者由于位于海外的官方软件源下载速度过于感人时,需要添加国内 ...
- 这份前端面试小册子dog cheng带来啦~
写在前面 没有错,就是我啦dog cheng,好久不见,从17年在博客园写下第一篇文章,转身间已然两年,从大二到现在的大四预备毕业生,我仍然在这条道路上前进.秋招早已经结束,在拿到用友,滴滴的offe ...
- vue 项目使用JSbrideg.js与app通信
一.建立JSbrideg.js文件 var jsBridge = { isAndroid: null, isIOS: null, callHandlerFunc: functi ...
- 致Java初学者
致Java初学者 精心整理资料点击获取 前言 能看到这篇文章的朋友,应该都或多或少的了解Java,也许你现在是个菜鸟还在成长的路上.再此期间你一定遇到了很多困惑疑虑,对未来的学习方向感到很迷惑.作 ...
- Ceph日常运维管理和排错 -- <7>
Ceph日常运维管理 集群监控管理 集群整体运行状态 [root@cephnode01 ~]# ceph -s cluster: id: 8230a918-a0de-4784-9ab8-cd2a2b8 ...
- python可变对象
- 每个对象中都保存了三个数据: id(标识) type(类型) value(值) - 列表就是一个可变对象 a = [1,2,3] - a[0] = 10 (改对象) - 这个操作是在通过变量去修改 ...