Spring IOC容器的实现原理
1 概述
1.1 依赖反转模式
在Java中,一个复杂的功能一般都需要由两个或者两个以上的类通过彼此合作来实现业务逻辑的,这使得每个对象都需要与其合作的对象的引用。如果这个获取依赖对象的过程需要自己去实现,那么这将导致代码的高度偶尔并且难以测试。
依赖反转就是对象依赖关系的管理被反转了(获取依赖对象的方式进行了反转),以前是自己主动获取依赖对象,现在是通过框架或者IOC容器将依赖对象注入进来(也可以称之为依赖注入),将依赖对象的管理转到了框架或者IOC容器中,极大了降低了代码之间的耦合性。
1.2 IOC中的注入方式
常见的有接口注入,setter注入和构造器注入三种方式;
相对而言,使用Spring时setter注入是常见的注入方式。
2. IOC容器的设计与实现:BeabFactory和ApplicationContext
Spring IOC 容器的设计中,主要由两个容器系列
一个是实现BeabFactory接口的简单容器系列,只实现了容器的基本功能;
一个是ApplicationContext应用上下文,作为容器的高级形态而存在,增加了许多面向框架的特性;
2.1 IOC容器的设计

上图是IOC容器的接口设计图,主要包括两条设计主线:
从BeabFactory接口到HierarchicalFactory接口,再到ConfigurableBeanFactory接口,这是一条主要的BeanFactory设计路线:
在这条设计路线中,BeabFactory定义的容器的基本功能,HierarchicalFactory增加了getParentBeanFactory()的接口功能,使得容器具有双亲IOC容器的管理功能;ConfigurableBeanFactory主要定义了一些对BeabFactory的配置功能。
第二条设计路线是以ApplicationContext接口为核心的接口设计:
在这个接口设计中,通过ListableBeanFactory和HierarchicalFactory连接BeabFactory和ApplicationContext接口定义,ApplicationContext还通过继承MessageResource接口、ResourceLoder接口和ApplicationEventPublisher接口,添加了许多对高级容器的特性支持。
DefaultListableBeanFactory 是ConfigurableBeanFactory的一个实现类,它作为一个默认的功能完整的IOC容器实现,其他的高级容器都是在它的基础上进行扩展;
2.2 BeabFactory的应用场景
BeabFactory提供最基本的IOC容器功能,这些功能定义都可以在接口中看到。
XmlBeabFactory是DefaultListableBeanFactory 的子类,它是一个以读取xml文件方式定义bean的容器。
Spring IOC容器的实现原理的更多相关文章
- 【转】Spring学习---Spring IoC容器的核心原理
[原文] Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的生态帝国. IoC和DI的基本概念 IoC(控制反转,英文含义:Inverse of Control)是Spr ...
- 三条路线告诉你如何掌握Spring IoC容器的核心原理
原文链接:https://blog.csdn.net/bntx2jsqfehy7/article/details/78977178
- spring-framework-中文文档一:IoC容器、介绍Spring IoC容器和bean
5. IoC容器 5.1介绍Spring IoC容器和bean 5.2容器概述 本章介绍Spring Framework实现控制反转(IoC)[1]原理.IoC也被称为依赖注入(DI).它是一个过程, ...
- Spring IOC 容器源码分析 - 余下的初始化工作
1. 简介 本篇文章是"Spring IOC 容器源码分析"系列文章的最后一篇文章,本篇文章所分析的对象是 initializeBean 方法,该方法用于对已完成属性填充的 bea ...
- Spring IOC 容器源码分析 - 填充属性到 bean 原始对象
1. 简介 本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的.我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反 ...
- Spring IOC 容器源码分析 - 循环依赖的解决办法
1. 简介 本文,我们来看一下 Spring 是如何解决循环依赖问题的.在本篇文章中,我会首先向大家介绍一下什么是循环依赖.然后,进入源码分析阶段.为了更好的说明 Spring 解决循环依赖的办法,我 ...
- Spring IOC 容器源码分析 - 创建原始 bean 对象
1. 简介 本篇文章是上一篇文章(创建单例 bean 的过程)的延续.在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程.本篇文章,我们就从战术的层面上,详细分析doCreat ...
- Spring IOC 容器源码分析 - 创建单例 bean 的过程
1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...
- Spring IOC 容器源码分析 - 获取单例 bean
1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...
随机推荐
- tesseract编译错误:fatal error: allheaders.h: No such file or directory
错误描述: globaloc.cpp::: fatal error: allheaders.h: No such file or directory #include "allheaders ...
- cdnbest的proxy里api用法案例:
用户的proxy帐号里api key要设置好,那个key设置后是不显示的,但会显示已设置 key是自已随便生成的 $uid = 22222; $skey = 'langansafe&*#'; ...
- JavaScript实现观察者模式
首先: 观察者模式是软件设计模式的一种,它
- python数据类型分类
python数据分为可变类型和不可变类型,其中:可变类型:列表,字典不可变类型:布尔值,数字,字符串,元组 specidal:集合作为set是可变的,而作为frozenset是不可变集合 可变类型和不 ...
- SSM框架整合的其它方式
---------------------siwuxie095 SSM 框架整合的其它方式 1.主要是整合 Spring ...
- [leetcode]99. Recover Binary Search Tree恢复二叉搜索树
Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...
- node.js中net网络模块TCP服务端与客户端的使用
node.js中net模块为我们提供了TCP服务器和客户端通信的各种接口. 一.创建服务器并监听端口 const net = require('net'); //创建一个tcp服务 //参数一表示创建 ...
- jfinal处理完html提交过来的数据,将处理信息返回给html页面。html根据返回值进行相应的处理
1.前台jQuery代码: $.ajax({ url: "/admin/jcsjpz/syxmdy/RemoveSyxm", data: {data: id}, success: ...
- CSS 样式中的两个方法
在很多时候,我们需要LI开头空一点距离.结尾不能再有下划线了.这个效果在以前是很难实现的.但是有了下面两个选择器,非常容易做出这种东西. .slideTxtBox .bd ul > :first ...
- 分布式协议学习笔记(三) Raft 选举自编写代码练习
由于时间安排上的原因,这次的代码写的稍微有些简略,只能算是自己对RAFT协议的一个巩固. 实现定义2个节点,使用读取配置文件来获取IP和端口以及节点ID 网络使用boost同步流程 一个线程收 一个线 ...