为什么需要依赖注入

news/2024/12/23 17:42:37/文章来源:https://www.cnblogs.com/OceanEyes/p/18450799

为什么需要“依赖注入”
Case 1
public class Foo {
private Bar bar;
public Foo() {
bar = new Bar();
}
public void doSomething(int key) {
String result = bar.getResult(key);
//swithch result
}
}
反模式 ,在构造函数中,初始化了合作类,导致:

• 外部使用者不知道 Foo 里面还依赖了 Bar

• 无法对Bar单元测试,体现在 bar.getResult() 返回真实值,如果和网络、数据库、IO 打交道的话,这是一个很耗时的动作

Case 2
public class Foo {
private Bar bar=new Bar();
public Foo(){

}
public void doSomething(int key){
String result = bar.getResult(key);
//swithch result
}
}
反模式,虽然没有在构造函数中初始化 Bar 对象,但在字段中直接初始化了 Bar 对象,问题和上面一样

Case 3 使用 Guice 来对依赖进行管理
public class Foo {
private Bar bar ;
@Inject
public Foo(Bar bar) {
this.bar = bar;
}
public String doSomething(int key) {
return bar.getResult(key);
}
}

对于使用 Foo 的用户而言,一眼就知道 Foo 内部需要 合作类 Bar, 明白了 Foo 的职责,同时 @Inject 将依赖对象注入,解耦的同时还方便测试

public class TestCase {
@Mock
private Bar bar;
@Before
public void before(){
MockitoAnnotations.initMocks(this);
}
@Test
public void test(){
//Arrange
when(bar.getResult(eq(1))).thenReturn("jack");
Foo foo=new Foo(bar);
//Action
String result = foo.doSomething(1);
//Assert
Assert.assertEquals("jack",result);
}
}
上面可以看到,Mock 了 Bar 对象,Bar 对象的 getResult() 可能是一个比较耗时的功能,所以对它进行了Stub,同时 Foo 不依赖真实的 Bar 对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/809672.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式驱动开发学习路线整理

1、学习路线 1.1 知乎:菜鸟分享嵌入式Linux驱动开发学习路线与心得(一)嵌入式方向:嵌入式Linux系统中,往上有应用程序功能开发和界面设计,往下有内核编程相关的驱动开发; 学习嵌入式Linux需要的基础知识:C语言基础知识; 基础知识:操作系统相关知识、Linux系统基本使用…

你可能没听过的手机输入法技巧

其实手机输入法真的很强其实手机输入法真的很强 ‍ 手机输入法的自带功能 比起电脑上的输入法,手机上的输入法有一些特有的功能。这里就以 iPhone 为例进行讲解,而安卓的话大部分情况也有类似的功能,这里就不一一进行评测了。 ‍ 快速移动光标 当内容很多,想要移动光标到内…

Webpack 初始化

1、初始化npm项目 npm init -y 得到 package.json 2、安装 webpack,webpack-cli相关 npm install webpack webpack-cli --dev node_modules .bin目录有webpack相关 即可通过npm 运行 webpack命令 如: npm webpack --version 可直接执行 webpack命令进行打包也可这么着: webpac…

iPhone开机一直白苹果闪烁,3个解决卡在开机画面的方法!

很多苹果用户在网上反馈,某天iPhone开机一直卡在开机Apple标志画面,而且白苹果一直闪烁。长按电源键也无法正常启动设备,黑屏后还是会出现苹果logo,一直闪烁。遇到iPhone开机一直白苹果闪烁的情况,多半是因为iOS系统故障。更专业的说,是系统组件调用执行失败而导致无法出…

因果推断与间接效应

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 因果推断(Causal Inference)是统计学和数据科学中的重要分支,用于理解事件之间的因果关系,而不仅仅是相关性。与相关性分析不同,因果推断追求揭示因变量…

#HACKTHEBOX——Driver

靶机详情靶机地址:10.10.11.106 kali地址:10.10.16.4 初始侦察与渗透确认kali与靶机之间可以ping通使用nmap进行侦查扫描 nmap -sT --min-rate 1000 -p- 10.10.11.106 #以TCP协议,基于当前网络情况,以最低1000的速率进行该IP的全部端口nmap -sT -sC -sV -p 80,135,445,5985…

HACKTHEBOX——Crafty

靶机详情靶机地址:10.10.11.249 kali地址:10.10.16.3 端口服务扫描确认kali与靶机可以ping通使用nmap进行扫描 nmap -sT --min-rate 1000 -p- 10.10.11.249 #以TCP协议,基于当前网络情况,以最低1000的速率进行该IP的全部端口nmap -sT -sC -sV -p 80,25565 10.10.11.249 #详…

字符编码发展史5 — UTF-16和UTF-32

上一篇《字符编码发展史4 — Unicode与UTF-8》我们讲解了Unicode字符集与UTF-8编码。本篇我们将继续讲解字符编码的第三个发展阶段中的UTF-16和UTF-32。 2.3. 第三个阶段 国际化 2.3.2. Unicode的编码方式 2.3.2.2. UTF-16 UTF-16也是一种变长编码,对于一个Unicode字符被编码成…

24.10.07

A 质朴的想法,每一行都放 ryxyryx...,然后因为有 \(40\) 列所以最后一列完全没用,所以把那一行竖着放进去,算一下有 \(2223\) 个。 然后枚举填多少行,如果数量多了就在最后一行选一个位置插入字符(这样后面就没有斜着的贡献了)。还多就从后往前覆盖 y。然后总可以构造出…

ubuntu无法进入系统

ubutun重启卡在initramfs,无法进入系统_initramfs进不了界面-CSDN博客

matplotlib 斜体

matplotlib 斜体在 Matplotlib 中,斜体(Italic)字体可以用于改善图表的可读性或美观度。要设置斜体字体,你可以使用 Matplotlib 的字体属性。这可以通过几种方式实现,比如直接在文本字符串中使用 LaTeX 风格的斜体命令,或者使用字体属性字典来指定斜体。使用 LaTeX 风格的…

水务行业的数字化转型之路:四大挑战与展望

随着数字时代的全面到来,各行各业都在积极探索数字化转型的路径,而作为国民经济命脉之一的水务行业也不例外。水务行业的数字化转型不仅是技术革新的必然趋势,更是提升水资源管理效率、保障水安全、促进生态文明建设的关键举措。然而,在这一转型过程中,我们面临着诸多挑战…