当前位置: 首页 > 教程 > Google Guice >

Google Guice 介绍

精华
小牛编辑
245浏览
2023-03-14

Guice 是一个开源的、基于 Java 的依赖注入框架。它是轻量级的,由 Google 积极开发/管理。

普通的Java依赖注入

每个基于 Java 的应用程序都有一些对象,它们协同工作以呈现最终用户所看到的工作应用程序。在编写复杂的 Java 应用程序时,应用程序类应尽可能独立于其他 Java 类,以增加重用这些类的可能性,并在单元测试时独立于其他类进行测试。依赖注入(或有时称为连接)有助于将这些类粘合在一起,同时保持它们的独立性。

假设您有一个包含TextEditor组件的应用程序,并且您想要提供拼写检查。你的标准代码看起来像这样 

public class TextEditor {
   private SpellChecker spellChecker;
   
   public TextEditor() {
      spellChecker = new SpellChecker();
   }
}

我们在这里所做的是,在 TextEditor 和 SpellChecker 之间创建一个依赖项。在控制反转的情况下,我们会做这样的事情 :

public class TextEditor {
   private SpellChecker spellChecker;
   
   @Inject
   public TextEditor(SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }
}

在这里,TextEditor 不应该担心 SpellChecker 的实现。SpellChecker 将独立实现,并在 TextEditor 实例化时提供给 TextEditor。

使用Google Guice的依赖注入

依赖注入由 Google Guice 绑定控制。Google Guice 使用绑定将对象类型映射到它们的实际实现。这些绑定被定义为一个模块。模块是绑定的集合,如下所示:

public class TextEditorModule extends AbstractModule {
   @Override 
   protected void configure() {
      /*
      * Bind SpellChecker binding to WinWordSpellChecker implementation 
      * whenever spellChecker dependency is used.
      */
      bind(SpellChecker.class).to(WinWordSpellChecker.class);
   }
}

模块是注入器的核心构建块,注入器是 Google Guice 的对象图构建器。第一步是创建一个注入器,然后我们可以使用注入器来获取对象。

public static void main(String[] args) {
   /*
   * Guice.createInjector() takes Modules, and returns a new Injector
   * instance. This method is to be called once during application startup.
   */
   Injector injector = Guice.createInjector(new TextEditorModule());
   /*
   * Build object using injector
   */
   TextEditor textEditor = injector.getInstance(TextEditor.class);   
}

在上面的例子中,TextEditor 类对象图由 Google  Guice 构建,该图包含 TextEditor 对象及其依赖项作为 WinWordSpellChecker 对象。

最后更新:

类似资料

  • 我没有问题绑定单例实例到其他一些实例使用@注入。但是,当涉及到绑定一个类的更多实例到其他一些实例(这是单例),它拒绝以某种方式绑定它,我得到了空引用。 我的代码示例是: 当我创建几个WebSocketManagerImpl实例时,每个factoryImpl字段都是空指针。我做错什么了吗?

  • 在我的Play(Java)框架项目中,我正在使用Guice进行依赖项注入,并且正在努力理解如何最好地将“会话”的概念与Guice和Play结合使用? 我知道Play是无状态的,除了可以在cookie中存储值之外,实际上没有会话的概念。我对Guice和Play的理解是,虽然Guice文档描述了支持不同的作用域(单例、会话、请求、无作用域),但因为我们正在用每个请求实例化一个新的注入器,所以仅适用于P

  • 目录表 简介 Python的特色 概括 为什么不使用Perl? 程序员的话 简介 Python语言是少有的一种可以称得上即简单又功能强大的编程语言。你将惊喜地发现Python语言是多么地简单,它注重的是如何解决问题而不是编程语言的语法和结构。 Python的官方介绍是: Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程。Python简洁的语法和

  • A physicist, an engineer, and a computer scientist were discussing the nature of God. Surely a Physicist, said the physicist, because early in the Creation, God made Light; and you know, Maxwell's equ

  • 自动化测试对于现代web开发者来说,是非常实用的除错工具。你可以使用一系列测试-- 测试套件 -- 来解决或者避免大量问题: 当你编写新代码的时候,你可以使用测试来验证你的代码是否像预期一样工作。 当你重构或者修改旧代码的时候,你可以使用测试来确保你的修改不会在意料之外影响到你的应用的应为。 测试web应用是个复杂的任务,因为web应用由很多的逻辑层组成 -- 从HTTP层面的请求处理,到表单验证

  • 介绍 动机 核心概念 三大原则 先前技术 学习资源 生态系统 示例

开发工具