《Spring揭秘》-第二章- 学习记录

这篇具有很好参考价值的文章主要介绍了《Spring揭秘》-第二章- 学习记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、IoC的理念

IoC全称为Inversion of Control,中文翻译为控制反转,同时还有一个别名叫 依赖注入DI(Dependency Injection)。大多将IoC与DI看作同等概念,也有部分观点认为 依赖注入可以看作IoC的一种实现方式。

在没有Spring的时候,当我们需要依赖某个类或服务时,一般通过new创建一个对象(或者通过ServiceLocator解决直接的依赖耦合),这些都需要主动的去获取需要的对象。

ServiceLocator是通过引入中间代理者消除对象间复杂的耦合关系,并统一管理分散的复杂耦合关系。

IoC的出现就为我们提供了更加简洁的方式,不用主动去构造对象,将“主动获取”转变为“被动接收”,下图即为IoC在整个过程中的所承担的角色
《Spring揭秘》-第二章- 学习记录
通常情况下,被注入对象会直接依赖于被依赖对象。但是在IoC的场景中,二者通过IoC Service Provider来交互,全部由IoC Service Provider统一管理。控制权由被注入对象转变为了IoC Service Provider 那里。

public class NewsProvider {
	// NewsProvider 为被注入对象
	// INewsListener和INewsPersister为被依赖对象
	private INewsListener newsListener;
	private INewsPersister newsPersister;
}

其实IoC就是这么简单!以前是需要什么自己去拿,现在是需要什么东西别人主动送过来。下图形象的说明了使用IoC模式的前后差别
《Spring揭秘》-第二章- 学习记录

2、IoC(DI)的几种依赖注入的方式

IoC模式最常用的有三种依赖注入方式,分别是构造方法注入(Constructor Injection)、setter方法注入(Setter Injection)以及接口注入(Interface Injection)。

2.1、构造方法注入

构造方法注入即 被注入对象可以通过在其构造方法中声明所依赖对象的参数列表,让IoC容器知道它所需要的依赖对象列表。由于同一个对象是不可能是被构造两次的,因此,被注入对象的构造乃至其整个生命周期,都是由IoC Service Provider来管理的。

IoC Service Provider会检查被注入对象的构造方法,取得它所需要的依赖对象列表,进而为其注入相应的对象。具体代码示例如下

public class NewsProvider {
	// NewsProvider 为被注入对象
	// INewsListener和INewsPersister为被依赖对象
	private INewsListener newsListener;
	private INewsPersister newsPersister;
	
	public NewsProvider(INewsListener newsListener, INewsPersister newsPersister) {
		this.newsListener = newsListener;
		this.newsPersister = newsPersister;
	}
}

构造方法注入的方式比较直观,对象被构造完成后,就进入了就绪装填,可以马上使用。

2.2、setter方法注入

对于JavaBean对象来说,通常会通过setter方法来更改相应的对象属性。所以,当前对象只要为其依赖对象所对应的属性添加setter方法,就可以通过setter方法将相应的依赖对象设置到被注入对象中。代码示例如下

public class NewsProvider {
    // NewsProvider 为被注入对象
    // INewsListener和INewsPersister为被依赖对象
    private INewsListener newsListener;
    private INewsPersister newsPersister;
    
    public void setNewsListener(INewsListener newsListener) {
        this.newsListener = newsListener;
    }
    public void setNewsPersister(INewsPersister newsPersister) {
        this.newsPersister = newsPersister;
    }
}

这样,外界就可以通过调用setNewsListener和setNewsPersister方法来注入依赖对象了。

需要注意的是,setter方法注入不像构造方法注入那样,对象构造完成后即可使用,相对而言更加宽松一些,可以在对象构造完成之后再注入。

2.3、接口注入(基本废弃)

相对前面的两种注入方式来说,接口注入会更加复杂。被注入对象如果想让IoC Service Provider为其注入依赖对象,就必须实现某个接口。这个接口提供一个方法,用来为其注入依赖对象。IoC Service Provider 最终会通过这些接口来获取被注入对象所需要的依赖对象列表。

NewsProvicer为了让IoC Service Provider 为其注入所依赖的NewsListener对象,首先需要实现一个接口 INewsListenerCallable(名称随意),这个接口会声明一个injectNewsListener方法(名称随意),重要的是该方法的参数,必须是所依赖对象的类型。这样,对应的IoC Service Provider 就可以通过这个接口方法将依赖对象注入到 被注入对象 NewsProvider 当中。代码示例如下。

public interface NewsListenerCallable {
    // 声明方法
    void injectNewsListener(INewsListener newsListener);
}

public class NewsProvider implements NewsListenerCallable{
    private INewsListener newsListener;
    @Override
    public void injectNewsListener(INewsListener newsListener) {
        this.newsListener = newsListener;
    }
}

2.3、三种注入方式的比较

  • 构造方法注入。这种注入方式的优点就是,对象在构造完成之后,就已进入就绪状态,可以马上使用。缺点就是,当依赖对象变多时,构造方法的参数列表会比较长。同时通过反射构造对象时,对相同类型的参数处理会比较困难,维护和使用上也比较麻烦。而且在Java中,构造方法无法被继承,无法设置默认值。对于非必须的依赖处理,可能还需要引入多个构造方法,维护不便。
  • setter方法注入优点就是,在描述性上会比构造方法注入要好,同时可以被继承,允许设置默认值,而且有良好的IDE支持。缺点就是对象无法在构造完成后立马进入就绪状态。
  • 接口注入。从注入方式的使用上来说,接口注入是目前不提倡的一种方法,基本处于“退役状态”。因为需要被注入对象实现不必要的接口,带有侵入性。

综上,构造方法注入和setter注入因为其侵入性较弱,且易于理解和使用,所以是现在使用最多的注入方式;而接口注入由于其侵入性,已经不流行了。

本文由博客一文多发平台 OpenWrite 发布!文章来源地址https://www.toymoban.com/news/detail-409947.html

到了这里,关于《Spring揭秘》-第二章- 学习记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [第二章—Spring MVC的高级技术] 2.3 处理异常

    各位小猿,程序员小猿开发笔记,希望大家共同进步。 引言 我是谁——异常处理。 来自那——所有功能正常运行,但出现错误 怎么办——如何处理异常和响应客户端 我是谁——Spring框架中的一个注解 用在哪——应用在控制器类或方法上 什么用——用于在控制器方法中指定

    2024年01月22日
    浏览(33)
  • 第二章——开始学习C++

    进入C++ 首先介绍一个显示消息的简单C++程序(不同于以往的“Hello,world\\\")     注意看这里的文件名,是以.cpp 结尾的。这是C++程序常用的方式 在其他环境中可能需要不同的扩展名  另外C++对大小写敏感,也就是说严格区分大写字母和小写字母。 通过上面这一小段程序来分

    2024年02月13日
    浏览(28)
  • SV学习——数据类型(第二章)

    verilog有1995和2001版本,而SV是verilog的延伸,SV发布的时候直接就是3.0,之后可能不再存在verilog,而是统一用SV。SV是完全兼容verilog的。verilog文件以.v结尾,SV文件以.sv结尾。语法是全部兼容的,SV是verilog的扩展和延伸。 verilog中有reg和wire两种数据类型,都是四值逻辑 0,1,x,

    2024年02月10日
    浏览(64)
  • JS深入学习笔记 - 第二章.类和对象

    3.1面向对象 这里顺带提一句学习JAVA时,老师说的面向对象和面向过程的区别: 面向过程:强调做什么事情,具体什么步骤。举个把大象放进冰箱的例子: 打开冰箱门 把大象放进冰箱 关上冰箱门 面向对象: 强调的是做动作的主体(称之为对象) 冰箱 :打开操作 冰箱 :放

    2024年02月08日
    浏览(35)
  • 云计算学习,第二章,私有企业网络构建运维

    ( 1 )通过组网设计,掌握小型交换网络的组建,对小型网络系统进行分析,提出建网 解决方案。 ( 2 )掌握 Trunk 接口和 VLAN 相关技术概念。 ( 3 )综合运用 VLAN 创建、 Access 和 Trunk 接口配置、 VLAN 划分,实现网络的互连 互通。 1. 架构分析 ( 1 )需求分析 本实验的目的

    2024年02月03日
    浏览(43)
  • 【UnityShader入门精要学习笔记】第二章(3)章节答疑

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 (PS:章节答疑不是我答,是原作者对一些比较容易产生困惑的地

    2024年02月03日
    浏览(39)
  • C++学习之旅 第二章 printf与cout

    目录 1.printf简介  2.printf的四种用法 2.1 printf(\\\"字符串\\\"); 2.2 printf(\\\"输出控制符\\\",输出参数); 2.3 printf(\\\"输出控制符1 输出控制符2  ,,,,,,,, \\\", 输出参数1, 输出参数2,....... ); 2.4 printf(\\\"输出控制符 非输出控制符 \\\",输出参数); 3.printf为什么需要输出控制符 4.cout简介 cout的三种用法 5

    2024年02月08日
    浏览(48)
  • dx12 龙书第二章学习笔记 -- 矩阵代数

    1.矩阵及其运算 矩阵的运算 :①加②减③标量乘法 ④矩阵乘法: 矩阵乘法要有意义的条件是矩阵A的列数和矩阵B的行数必须相同,所以一般不满足交换律 ⑤转置矩阵: ⑥矩阵行列式:det A 学习行列式的主要目的是:利用它推导出求逆矩阵的公式 方阵A是可逆的,当且仅当det

    2024年02月11日
    浏览(37)
  • 云计算学习笔记——第二章 虚拟化与容器

    1.什么是虚拟化    一种计算机资源管理技术 ,将各种IT资源抽象、转换成平一种形式的技术都是虚拟化技术。 2.作用   通过该技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个计算机可运行不同的操作系统,并且应用程序都可以

    2024年01月22日
    浏览(36)
  • Rx.NET in Action 第二章学习笔记

    本章节涵盖的内容: 不使用Rx的工作方式 向项目中添加Rx 创建你的第一个Rx应用程序 Rx 的目标是协调和统筹来自社交网络、传感器、用户界面事件等不同来源的基于事件的异步计算。例如,建筑物周围的监控摄像头和移动传感器会在有人靠近建筑物时触发,并从最近的摄像头

    2024年02月12日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包