通过Guice进行依赖项注入

Guice 是一个依赖项注入(DI)框架。几年来我一直建议开发人员使用 DI,因为它提高 了可维护性、可测试性和灵活性。通过观察工程师对 Guice 的反馈,我发现说服程序员去采 用一种新技术的最好方法是使这种技术简单易用。Guice 让 DI 变得很简单,因此 Google 采用了这种方法。我希望本文能帮助您轻松学习 Guice。

Guice 2.0 beta

在写这篇文章时,Guice 开发团队正在奋力编写 Guice 2.0,希望能在 2008 年底之前发 布。早期的 beta 发布在 Google 代码下载站点(请参阅 参考资料)。这是一个好消息,因 为 Guice 团队添加了一些新功能,使 Guice 代码的使用和理解变得更简单。beta 版没有最 终版中的一些功能,但是 beta 很稳定,质量也很好。事实上,Google 在产品软件中使用的 是 beta 版。我建议您使用 beta 版。这篇文章是专门为 Guice 2.0 编写的,介绍了 Guice 的一些新功能,但没有讨论 1.0 中已经废弃的一些功能。Guice 团队向我保证:这里讨论的 功能在最终发行版和当前 beta 版中都是一样的。

如果您已经了解了 DI,而且知道为什么要借助一个框架来使用 DI,那么您可以跳到 通 过 Guice 进行基本注入 小节。否则,请继续阅读,了解 DI 的好处。

DI 案例

我将以一个例子开始。假设我正在编写一个超级英雄(superhero)应用程序,同时实现 一个名为 Frog Man 的 hero(英雄)。清单 1 是相关代码和第一个测试(您一定明白编写 单元测试的重要性,这里就不多说了)。

清单 1. 一个基本 hero 及其测试

public class FrogMan {
  private FrogMobile vehicle = new FrogMobile();
  public FrogMan() {}
  // crime fighting logic goes here...
}
public class FrogManTest extends TestCase {
public void testFrogManFightsCrime() {
   FrogMan hero = new FrogMan();
   hero.fightCrime();
   //make some assertions...
  }
}

似乎一切正常,但在运行测试时出现了如清单 2 所示的异常:

清单 2. 依赖项出现问题

java.lang.RuntimeException: Refinery startup failure.
  at HeavyWaterRefinery.<init>(HeavyWaterRefinery.java:6)
  at FrogMobile.<init>(FrogMobile.java:5)
  at FrogMan.<init>(FrogMan.java:8)
  at FrogManTest.testFrogManFightsCrime(FrogManTest.java:10)

似乎 FrogMobile 构建了一个 HeavyWaterRefinery,假设我不能在测试中构建其中一个 依赖项。当然,我可以在生产环境中实现这一点,但是不能保证能在测试中构建第二个提炼 厂(refinery)。在现实生活中,您不可能提炼出氧化氘,但您可以依赖远程服务器和强大 的数据库。原理是一样的:这些依赖项很难启动,交互起来也很慢,这使得测试比平时更容 易失败。

输入 DI

为了避免这个问题,您可以创建一个接口(例如 Vehicle),使 FrogMan 类接受 Vehicle 作为一个构造函数参数,如清单 3 所示:

清单 3. 依赖接口并注入它们

public class FrogMan {
  private Vehicle vehicle;
  public FrogMan(Vehicle vehicle) {
   this.vehicle = vehicle;
  }
  // crime fighting logic goes here...
}

时间: 2016-04-09

通过Guice进行依赖项注入的相关文章

Java EE 6全新的功能和服务:上下文和依赖关系注入

在 Java 中,类可以拥有非原始类型的变量(字段).在复杂的应用程序中,这些字段的类型可以代表复杂的技术解决方案.例如,Record 类可以拥有类型为 javax.sql.DataSource 的字段,表示 Record 的一个实例将依赖关系型数据源才能正常工作.在 Java EE 中,您将通过 JNDI 查找一个实例,从而获取该数据源的一个实例.清单 1 中显示了一个示例. 清单 1. 使用 JNDI 获取对依赖关系的引用 Initialhttp://www.aliyun.com/zixun

在附加依赖项里面已经添加了相应的lib文件,为什么编译链接的时候还是提示无法解析的外部符号?

问题描述 在附加依赖项里面已经添加了相应的lib文件,为什么编译链接的时候还是提示无法解析的外部符号? 错误 1 error LNK2019: 无法解析的外部符号 _D3DX11CompileFromFileW@44,该符号在函数 "protected: bool __thiscall D3Dclass::CompileD3DShder(wchar_t const *,char *,char *,struct ID3D10Blob * *)" (?CompileD3DShder@D3D

System.BadImageFormatException: 未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项。试图加载格式不正确的程序。

        本机环境:Win7 32位,开发工具:vs2008         今天更新webservices的时候,如下图:               报出了下面的错误:                  在服务端打开asmx文件时,错误信息如下: "/"应用程序中的服务器错误. 未能加载文件或程序集"Oracle.DataAccess"或它的某一个依赖项.试图加载格式不正确的程序. 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,

WPF and Silverlight学习笔记(十三):依赖项属性和路由事件

一.依赖项属性(Dependency Property) Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能.这些服务通常统称为 WPF 属性系统.由 WPF 属性系统支持 的属性称为依赖项属性.本概述介绍 WPF 属性系统以及依赖项属性的功能,这 包括如何在可扩展应用程序标记语言 (XAML) 中和代码中使用现有的依赖项属性 . 依赖项属性的用途在于提供一种方法来基于其他输入的值计算属性值 .这些

AOP@Work: 用AspectJ和Spring进行依赖项插入

面向方面开发人员可以采用的高级技术 简介:依赖项插入和面向方面编程是互补的技术,所以想把它们结合在一起 使 用是很自然的.请跟随 Adrian Colyer 一起探索两者之间的关系,并了解怎样 才 能把它们组合在一起,来促进高级的依赖项插入场景. 依赖项插入和面向方面编程(AOP)是两个关键的技术,有助于在企业应用程 序中简化和纯化域模型和应用程序分层.依赖项插入封装了资源和协调器发现的 细节,而方面可以(在其他事情中)封装中间件服务调用的细节 -- 例如,提 供事务和安全性管理.因为依赖项插入

aspnet-未能加载文件或程序集“SharpSvn”或它的某一个依赖项。流入了不在清单中的模块

问题描述 未能加载文件或程序集"SharpSvn"或它的某一个依赖项.流入了不在清单中的模块 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.IO.FileLoadException: 未能加载文件或程序集"SharpSvn"或它的某一个依赖项.流入了不在清单中的模块. (异常来自 HRESULT:0x80131043) 源错误: 执行当前 Web 请求期

mfc-外部依赖项中再添加.h文件

问题描述 外部依赖项中再添加.h文件 用vs2010建立的MFC程序,怎么在外部依赖项中再添加.h文件 解决方案 1.将过去的工程用VS2010打开的时候.你有可能会遇到一大堆的警告:warning C4996. 比如:warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation use _CRT_SECURE_

无法找到资源。 说明: HTTP 404。您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用。请检查以下 URL 并确保其拼写正确

问题描述 法找到资源.说明:HTTP404.您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用.请检查以下URL并确保其拼写正确.请求的URL:/Aquaculture/department/Purchase.aspx请高手们帮忙看看,是哪写错了,这是登录的后台,我想实现选择不同部门,跳转到不同页面,然后就一直报上面那个错误代码如下:usingSystem;usingSystem.Collections;usingSystem.Configuration;using

SpringJunit单元测试@ContextConfiguration无法加载依赖项目的beans

问题描述 SpringJunit单元测试@ContextConfiguration无法加载依赖项目的beans 在b2b2c项目中做单元测试时,无法加载base项目中的Spring Application jdbc的配置文件 导致获得的JDBC对象为空,请大侠指导一下怎样才能在 b2b2c中对service对单元测试 可以加载base项目中的application-jdbc.xml配置文件获取到dao对象. 解决方案 ""关于如何使用SpringJunit进行单元测试@ContextC