首页 > 其他分享 >为什么需要依赖注入

为什么需要依赖注入

时间:2024-10-07 22:48:53浏览次数:7  
标签:为什么 依赖 Bar result key bar Foo public 注入

为什么需要“依赖注入”

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);   } }

上面可以看到,MockBar 对象,Bar 对象的 getResult() 可能是一个比较耗时的功能,所以对它进行了Stub,同时 Foo 不依赖真实的 Bar 对象。

标签:为什么,依赖,Bar,result,key,bar,Foo,public,注入
From: https://www.cnblogs.com/OceanEyes/p/18450799

相关文章

  • 重启后,idea 依赖爆红
    没改动代码,但无法运行java项目java:-source1.5中不支持……表达式/运算符java:错误:不支持发行版本5解决:https://www.cnblogs.com/liu-han/p/16105953.html文件→项目结构,SDK和项目/模块语言级别的版本要一致SDK:1.8项目语言级别:SDK默认值模块语言级别:SDK默认值......
  • 为什么安装了SSL证书还是不能HTTPS访问?
    安装了SSL证书后仍然无法通过HTTPS访问网站可能有以下几个原因:证书未正确配置:确保在服务器上正确安装并配置了SSL证书。这包括将证书文件正确放置,并在服务器软件中启用HTTPS。域名不匹配:检查SSL证书绑定的域名是否与实际访问的域名一致。如果访问的域名不在证书覆盖范围内,则......
  • float小,double大,我把小的数放到大的空间里面,为什么还会有精度损失?
    让我们来看这样一个例子:doublea=2.3F;System.out.println(a);输出的a为2.299999952316284不再是2.3了!明明float小,double大,我把小的数放到大的空间里面,为什么还会有“精度损失”?关键点是表示精度而非“空间”大小:浮点数的存储机制(IEEE754标准):float和......
  • java中,8个字节的long为什么可以自动转换为4个字节的float
    在Java中,long类型是8个字节(64位)的整数,而float类型是4个字节(32位)的单精度浮点数。虽然long有更大的字节数,但它可以自动转换为float。这是因为两者的表示形式和数据范围不同。1.表示方式的差异long类型:long是64位有符号整数,表示的数值范围是-2^63到2^......
  • 常见问题解决 --- maven手动安装依赖jar包报错
    报错内容:执行命令mvninstall:install-file-DgroupId=com.beidouapp-DartifactId=SSDK-Dversion=4.0.2.0 -Dfile=C:\1\SSDK-Release-4.0.2.0.jar-Dpackaging=jar报错Unknownlifecyclephase“.ggstar“.Youmustspecifyavalidlifecyclephaseoragoal原因:在pow......
  • Spring AOP实现自动注入用户信息
    背景在现代Web应用开发中,通常需要记录数据库操作的用户信息,以便于审计和跟踪。传统的方法是通过前端在每次请求时携带用户信息,但这样做存在几个问题:效率低:前端需要在每个请求中重复发送相同的用户信息。安全性差:信息容易被篡改,因为前端是不受信任的环境。维护困难:随着系统的......
  • [MySQL]为什么大厂选择读已提交
    为什么读已提交的并发性更好在数据库中,锁的时间和范围是影响并发性的重要因素。已提交读(ReadCommitted)隔离级别与可重复读(RepeatableRead)的主要区别就在于它们在读取数据时对锁的使用方式不同。让我们详细看看为什么已提交读的锁的时间和范围更小。1.已提交读(ReadCommitte......
  • 帝国CMS为什么发布内容时间为“1970-01-01 ”
    在发布内容时,如果时间显示为 1970-01-01,通常是因为以下几个原因:字段未设置为录入项:在建立系统模型时,newstime 字段没有被设置为录入项。字段不可修改:即使设置了录入项,但该字段可能被设置为不可修改。字段不可增加:该字段可能被设置为不可增加。解决方法要解决这个问题,需要......
  • 为什么帝国cms验证码一直均显示为“ecms”
    在帝国CMS中,验证码显示为“ecms”的主要原因是因为服务器空间不支持GD库(GraphicsDrawingLibrary)。GD库是PHP的一个扩展库,用于生成图像,如验证码图片。当服务器不支持GD库时,验证码生成功能会受到影响,导致默认显示为“ecms”。解决方案升级服务器环境:确保服务器支持GD库。使用......
  • VUE 安装依赖 -D -S 区别
    -S和-D是两个不同的标志,它们分别用于指定包的安装类型:-S或--save:这个标志用于将包添加到项目依赖中,并且会保存到package.json文件的dependencies部分。这些依赖是运行项目所必需的,通常在项目的生产环境中也会被使用。-D或--dev:这个标志用于将包添加到项目的开......