一、Spring Framework的核心:IoC容器的实现

1.1Spring IoC的容器概述

1.1.1 IoC容器和控制反转模式

依赖控制反转的实现有很多种方式。在Spring中,IOC容器是实现这个模式的载体,它可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖。这种依赖注入是可以递归的,对象被逐层注入。

关于如何反转对依赖的控制,把控制权从具体的业务对象手中转交到平台或者框架中,是降低面向对象系统设计复杂性和提高面向对象系统可测试性的一个有效的解决方案。它租金了IOC设计模式的发展。

通过使用IOC容器,对象关系依赖的管理被反转了,转到IOC容器中来了,对象之间的相互依赖的关系由IOC容器进行管理,并由IOC容器完成对象的注入。因为很多对象依赖关系的建立和维护并不需要和系统的运行状态有很强的关联性,所以可以把面向对象中需要执行的如新建对象、为对象引用赋值等操作交由容器来统一完成。

1.1.2 Spring IOC的应用场景

IOC设计模式,是解耦组件之间复杂关系的利器,Spring IOC模块就是一种实现。以应用开发人员的身份设计组件时,往往需要引用和调用其他组件的服务,这种依赖关系如果固化在组件的设计中,就会造成依赖关系的僵化和维护难度的增加,使用IOC容器,把资源获取的方向反转,让IOC容器主动管理这些依赖关系,将这些依赖关系注入到组件中,会让依赖关系的适配和管理更加灵活。在具体的注入实现中,接口注入、setter注入、构造器注入是主要的注入方式。在Spring的IOC设计中,setter注入和构造器注入是主要的注入方式。另一方面,在应用管理依赖关系时,可以通过IOC容器将控制进行反转,在反转的实现中,如果能通过可读的文本来完成配置,并且还能通过工具对这些配置信息进行可视化的管理和浏览,能够提高对组件关系的管理水平。并且如果耦合关系需要变动,并不需要重新修改和编译Java源代码,这符合面向对象设计中的开闭原则,如果结合osgi的使用特性,还可以提高应用的动态部署能力。

1.2 Ioc容器系列的设计与实现:BeanFactory和ApplicationContext

在Spring Ioc容器的设计中,有两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本的功能;另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在。

1.2.1 Spring的Ioc容器系列

作为IOC容器,需要为他的具体实现指定基本的功能规范,功能规范的设计表现为接口类BeanFactory,它体现了Spring为提供给用户使用的Ioc容器所设定的最基本的功能规范。对Spring的具体IOC容器的实现来说,他需要满足BeanFactory这个基本的接口定义,BeanFactory作为一个最基本的接口类出现在Spring的Ioc容器体系中。

在这些Spring提供的基本Ioc容器的接口定义和实现的基础上,Spring通过定义BeanDefinition来管理基于Spring的应用中的各种对象以及他们之间的相互依赖关系。BeanDefinition抽象了我们对Bean的定义,是让容器起作用的主要数据类型。对Ioc容器来说,BeanDefinition就是对依赖反转模式中管理的对象依赖关系的数据抽象,也就是容器实现依赖反转功能的核心数据结构,依赖反转都是围绕对这个BeanDefinition的处理来完成的。

同时,再使用IOC容器时,了解BeanFactory和ApplicationContext之间的区别对我们理解和使用Ioc容器也是比较重要的。

1.2.2 Spring IoC容器的设计

  • 从接口BeanFactory到HierarchicalBeanFactory,再到ConfigurableBeanFactory,是一条主要的BeanFactory设计路径。在此路径,BeanFactory接口定义了基本的Ioc容器的规范。在这个接口定义中,包括了getBean()这样的IoC容器的基本方法。而HierarchicalBeanFactory接口在继承了BeanFctory的基本接口之后,增加了getParentBeanFactory()的接口功能,使BeanFactory具备了双亲Ioc的管理功能。在接下来的ConfigurableBeanFactory接口中,主要定义了一些对BeanFactory的配置功能,比如通过setParentBeanFactory()设置双亲IOC容器,通过addBeanPostProcessor()配置Bean后置处理器等。
  • 第二条接口设计主线是,以ApplicationContext应用上下文接口为核心的接口设计,涉及的主要接口设计有,从BeanFactory到ListableBeanFactory,再到ApplicationContext,再到我们常用的WebApplicationContext或者ConfigurableApplicationContext接口。
  • 第三个路线涉及的是主要接口关系,而具体的IOC容器都是在这个接口体系下实现的,比如DefaultListableBeanFctory,这个基本IOC容器的实现就是实现了ConfigurableBeanFactory,从而成为一个简单的Ioc容器实现。
  • 这个接口系统是以BeanFactory和ApplicationContext为核心的。而BeanFactory又是Ioc容器的最基本接口,在ApplicationContext的设计中,一方面,可以看到它继承了BeanFactory接口体系中的ListableBeanFactory、AutowireCapableBeanFactory、HierarchicalBeanFacctory等BeanFactory的接口,具备了BeanFactory Ioc容器的基本功能;另一方面,通过继承MessageSource、ResourceLoadr、ApplocationEventPublisher这些接口,BeanFactory为ApplicationContext赋予了更高级的Ioc容器特性。对于ApplicationContext而言,为了在Web环境中使用它,还设计了WebApplicationContext接口,而这个接口通过继承ThemeSource接口来扩充功能

Spring核心实现篇的更多相关文章

  1. Spring boot学习1 构建微服务:Spring boot 入门篇

    Spring boot学习1 构建微服务:Spring boot 入门篇 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...

  2. 自己实现spring核心功能 一

    聊聊spring spring对于java开发者来说,是最熟悉不过的框架了,我们日常开发中每天都在使用它.它有着各种各样的好处,简单易用,得心应手... ... 我们一说到spring就会讲到ioc ...

  3. Spring Cloud第九篇 | 分布式服务跟踪Sleuth

    ​ ​本文是Spring Cloud专栏的第九篇文章,了解前八篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...

  4. Spring 核心功能演示

    Spring 核心功能演示 Spring Framework 简称 Spring,是 Java 开发中最常用的框架,地位仅次于 Java API,就连近几年比较流行的微服务框架 SpringBoot, ...

  5. 读源码之Spring 核心内容

    为什么有这篇文档 工作两三年之后,总感觉什么东西都懂,但是什么东西又都不会.所以日常学习是很有必要的,俗话说学而不思则罔 ,思而不学则殆.所以我们要学思结合,学习的方法有很多,但是思考的深度或者说有没 ...

  6. 死磕Spring之IoC篇 - BeanDefinition 的加载阶段(XML 文件)

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  7. 死磕Spring之IoC篇 - BeanDefinition 的解析过程(面向注解)

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  8. 死磕Spring之IoC篇 - 开启 Bean 的加载

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  9. 死磕Spring之IoC篇 - Bean 的创建过程

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

随机推荐

  1. Node.js 介绍

    章节 Node.js 介绍 Node.js 入门 Node.js 模块 Node.js HTTP模块 Node.js 文件系统模块 Node.js URL模块 Node.js NPM Node.js ...

  2. vue学习(十)mixin 偷懒

    一 mixin混入偷懒技术 架子 <div id="app"> {{msg}} </div> <script> let app = new Vu ...

  3. HDU - 4082 Hou Yi's secret

    题意:射箭落在n个点,任取三点可构成一个三角形,问最大的相似三角形集(一组互相相似的三角形)的个数. 分析: 1.若n个点中有相同的点,要去重,题目中说射箭会形成洞,任选三个洞构成三角形,因此射在同一 ...

  4. 2. Jetson TX2--python3下编译安装opencv3.4

    https://cloud.tencent.com/developer/article/1327273 jetpack3.2自带了opencv3.3,但是只提供了python2.7的编译版本,所以也只 ...

  5. PHP上传图片,路径保存在数据库中,根据图片路径显示图片

    1.创建数据表   CREATE TABLE image( id int(4) unsigned NOT NULL AUTO_INCREMENT, name varchar(100) default ...

  6. 服务器搭建---Linux安装Node.js

    先去官网下载:https://nodejs.org/en/download/ 把压缩包上传到服务器的/usr/local/soft(博主习惯)文件夹下  解压文件: cd /usr/local/sof ...

  7. Vue.js(18)之 axios简单封装

    基于vue-cli2.x封装axios src目录 axios.js import axios from 'axios' import { Indicator, Toast } from 'mint- ...

  8. Short Essay你真的会写了吗?

    提到short essay(可能其他essay也一样),很多同学都很头疼.“没有思路?不知从何下笔?没有亮点?”等等,这些都是同学们的致命伤,因此,short essay就成为了广大留学生的“送命题” ...

  9. linux部分环境搭建

    连接数据库: mysql -hrm-uf6b23117l3s5t69zjo.mysql.rds.aliyuncs.com -uwswl -pwswl@2019 显示用户: show databases ...

  10. swiper用axios异步请求后 循环失效

    解决方案 使用ajax动态获取数据  当数据还没有收到的时候,swiper组件收到的是跟组件data传过来的空数组,会造成渲染问题 这个时候可以给swiper组件 设置一个  v-if='list.l ...