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 源码的一 ...
随机推荐
- sqlserver truncate清空表时候,无法删除 'B表',因为该表正由一个 FOREIGN KEY 约束引用。
外键: 查询:select object_name(a.parent_object_id) 'tables' from sys.foreign_keys a where a.referenced_ ...
- 十一 hashlib模块
# 1.什么叫hash:hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),该算法接受传入的 ...
- java各历史版本官网下载
java各历史版本官网下载: http://www.oracle.com/technetwork/java/javase/archive-139210.html
- python基础(二)列表与字典
列表list-数组stus=['苹果','香蕉','橘子','红枣',111.122,]# 下标 0 1 2 3 4#下标,索引,角标#print(stus[4]) #st=[]#空list#st=l ...
- node.js中使用 http-proxy 创建代理服务器
代理,也称网络代理,是一种特殊网络服务,允许一个终端通过代理服务与另一个终端进行非直接的连接,这样利于安全和防止被攻击. 代理服务器,就是代理网络用户去获取网络信息,就是信息的中转,负责转发. 代理又 ...
- makefile中一些编译器选项
Libraries Static Libraries a collection of ordinary object files (目标文件的集合) loaded at program link ti ...
- swap的实现(没有中间变量)
两数交换最常用的方法 void swap(int &a,int &b) { int temp=a; a=b; b=temp; } 如果没有中间变量temp可以使用呢,还有其他的三种方法 ...
- org.hibernate.InvalidMappingException: Could not parse mapping document from resource com/domain/book.hbm.xml 联网跑一跑
org.hibernate.InvalidMappingException: Could not parse mapping document from resource com/domain/boo ...
- 判断是否是json
转:https://blog.csdn.net/dy_smile/article/details/46739251 function isJson(obj) { var isjson = typeof ...
- 【Spark2.0源码学习】-7.Driver与DriverRunner
承接上一节内容,Client向Master发起RequestSubmitDriver请求,Master将DriverInfo添加待调度列表中(waitingDrivers),下面针对于Dri ...