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 源码的一 ...
随机推荐
- 解决no module named ipykernel_launcher
解决no module named ipykernel_launcher 最近开hydrogen的时候,提示no module named ipykernel_launcher. 记得以前解决过这个问 ...
- C语言冷知识
C语言属强类型语言(1)编程语言分2种:强类型语言和弱类型语言.强类型语言中所有的变量都有自己固定的类型,这个类型有固定的内存占用,有固定的解析方法:弱类型语言中没有类型的概念,所有变量全都是一个类型 ...
- 微信小程序---人脸识别(wx.startFacialRecognitionVerify)
1.由于人脸核验功能涉及到用户的敏感.隐私信息,因此调用此接口的业务方,需要满足一定的条件,申请小程序的人脸识别api.开通小程序后台的接口权限入口后,开发者可以登录mp.weixin.qq.com小 ...
- Linux下,如何查看磁盘是否包含数据
可以使用lquerypv -h来查看磁盘是否包含数据,或磁盘头是否被dd过.这在安装RAC的过程中,是非常实用的一个命令.如果不包括数据的话,那么如下所示: [ZFFR4CB2101:root]/]& ...
- cdnbest如何查看节点和站点的流量,负载和连接信息
1. 通过查看top信息,查看该区域下所有节点和有访问量的站点的负载情况 点节点列表==>top图标 2. 查看单台节点的负载和连接信息 点节点列表==>管理 点击下图中三个红框可以查看单 ...
- cdnbest自定义错误显示节点名教程
在自定义错误里选择js选项,输入: document.write("error!" + hostname); 这是最简单的写法,只显示节点名,如果要显示其他效果,可自已修改js
- 大数据入门到精通6---spark rdd reduce by key 的使用方法
1.前期数据准备(同之前的章节) val collegesRdd= sc.textFile("/user/hdfs/CollegeNavigator.csv")val header ...
- eclipse删除了文件,找回方法
本人通过eclipse在前段时间上传svn代码的时候,代码掉完了,导致的原因是:svn服务器上有有个一样的文件夹,只是大小写不同,但是svn会认为是一样的文件夹,导致svn[]判别不了传到哪个文件夹去 ...
- 247. Strobogrammatic Number II输出所有对称数字
[抄题]: A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at u ...
- odoo研究学习:刷新本地模块列表都干了什么事?
模块信息存储在ir.module.module 数据表中 平时在开发过程中经常会刷新本地模块列表,例如:新增了模块.更新了模块基础信息.更换了模块图标等等,在点击‘更新’按钮的时候odoo平台到底干了 ...