一、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. 转载:HTTP 请求头中的 X-Forwarded-For,X-Real-IP

    转载:https://www.cnblogs.com/diaosir/p/6890825.html  X-Forwarded-For 在使用nginx做反向代理时,我们为了记录整个的代理过程,我们往往 ...

  2. EF Core的安装及入门

    一.环境准备 1.开发环境:.NET Core 3.1 2.IDE工具:Visual Studio 2019 3.数据库:SQL Server 2012 二.EF Core的安装 1.新建一个项目,如 ...

  3. Swift 3必看:从使用场景了解GCD新API

    https://www.jianshu.com/p/fc78dab5736f 2016.10.06 21:59* 在学习Swift 3的过程中整理了一些笔记,如果想看其他相关文章可前往<Swif ...

  4. MD5碰撞和MD5值(哈希值)相等

    md5的碰撞 0e开头的md5和原值: s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974 ...

  5. python从命令窗口启动脚本 创建并写入内容到文件示例

    写入到文件示例: #!/usr/bin/env python3 from math import exp, log, sqrt import re from datetime import date, ...

  6. 吴裕雄--天生自然 JAVASCRIPT开发学习:while 循环

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. idea xml文件去掉背景黄色

    编写dao中的sql时,xml文件中背景一大片黄色,看着不舒服,如何去掉了? 1. File -> Settings... 2. 去消以下两项勾选    (Inspections    -- 如 ...

  8. LinkedList源码阅读笔记

    LinkedList LinkedList是双向链表,不循环(1.6之前循环),继承AbstractSequentialList类,实现了List, Deque, Cloneable接口. 链表的特点 ...

  9. Javascript声明和使用变量

    1.1变量的声明 要在程序中使用变量,就必须从声明变量学起,因为Javascript语法与我们基础的其他程序语言声明变量的方法略有不同,但是Javascript语法的变量应用非常强大,使用也非常简单. ...

  10. 循环(while,break,continue),转义字符

    01. 程序的三大流程 在程序开发中,一共有三种流程方式: 顺序 -- 从上向下,顺序执行代码 分支 -- 根据条件判断,决定执行代码的 分支 循环 -- 让 特定代码 重复 执行 02. while ...