使用Google Guice消除实例之间的歧义

如果接口有多个实现,则Google guice提供了一种精巧的方法来选择目标实现。 我的示例基于Josh Long ( @starbuxman )的出色文章,内容涉及Spring提供的类似机制。

因此,请考虑一个名为MarketPlace的接口,该接口具有两个实现,分别是AndroidMarketPlace和AppleMarketPlace:

interface MarketPlace {
}class AppleMarketPlace implements MarketPlace {@Overridepublic String toString() {return "apple";}
}class GoogleMarketPlace implements MarketPlace {@Overridepublic String toString() {return "android";}
}

并考虑以下实现的用户:

class MarketPlaceUser {private final MarketPlace marketPlace;public MarketPlaceUser(MarketPlace marketPlace) {System.out.println("MarketPlaceUser constructor called..");this.marketPlace = marketPlace;}public String showMarketPlace() {return this.marketPlace.toString();}}

MarketPlaceUser消除这些实现歧义的一种好方法是使用一种称为绑定注释的guice功能。 要利用此功能,请首先通过以下方式为每个实现定义注释:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
@interface Android {}@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
@interface Ios {}

并将这些注释以及与该注释相对应的适当实现告知Guice活页夹:

class MultipleInstancesModule extends AbstractModule {@Overrideprotected void configure() {bind(MarketPlace.class).annotatedWith(Ios.class).to(AppleMarketPlace.class).in(Scopes.SINGLETON);bind(MarketPlace.class).annotatedWith(Android.class).to(GoogleMarketPlace.class).in(Scopes.SINGLETON);bind(MarketPlaceUser.class).in(Scopes.SINGLETON);}
}

现在,如果MarketPlaceUser需要使用一个或另一个实现,则可以通过以下方式注入依赖项:

import com.google.inject.*;class MarketPlaceUser {private final MarketPlace marketPlace;@Injectpublic MarketPlaceUser(@Ios MarketPlace marketPlace) {this.marketPlace = marketPlace;}}

这是非常直观的。 如果您担心定义太多注释,另一种方法可能是使用@Named内置的Google Guice注释,方法是:

class MultipleInstancesModule extends AbstractModule {@Overrideprotected void configure() {bind(MarketPlace.class).annotatedWith(Names.named("ios")).to(AppleMarketPlace.class).in(Scopes.SINGLETON);bind(MarketPlace.class).annotatedWith(Names.named("android")).to(GoogleMarketPlace.class).in(Scopes.SINGLETON);bind(MarketPlaceUser.class).in(Scopes.SINGLETON);}
}

并在需要依赖的地方以这种方式使用它:

import com.google.inject.*;class MarketPlaceUser {private final MarketPlace marketPlace;@Injectpublic MarketPlaceUser(@Named("ios") MarketPlace marketPlace) {this.marketPlace = marketPlace;}}

如果您有兴趣进一步探索,这里是Google guice示例和使用Spring框架的等效示例

翻译自: https://www.javacodegeeks.com/2015/02/disambiguating-between-instances-with-google-guice.html

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

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

相关文章

ref 和out 关键字

ref 和out 关键字 通过对CLR的学习,我们可以知道,CLR默认所有方法参数都是传值的。对于引用类型的对象,传递的是对象的引用(指向对象的指针),被调用者拥有该对象的引用的拷贝,能够修改对象&…

php-cli下载,php-cli-color

一个简单的 PHP 命令行 cli 输出彩色的类库安装composer require wujunze/php-cli-color ~1.0使用getColoredString("Testing Colors class, this is purple string on yellow background.", "purple", "yellow") . PHP_EOL;echo $colors->ge…

删除递归建立的文件

使用php的eclipse导入项目时不小心导致文件夹创建出现了恐怖的递归,创建了一个超级长的文件夹。删除时出现无法删除,指定的文件名无效或太长,资源管理器,或者命令行下del都用了,还是搞不定。曾尝试着一个个的改文件名并…

您会后悔对Lambdas应用重载!

编写好的API很难。 非常辛苦。 如果您想让用户喜欢您的API,则必须考虑很多事情。 您必须在以下两者之间找到适当的平衡: 有用性 易用性 向后兼容 前向兼容性 之前,在我们的文章: 如何设计良好的常规API中,我们已经…

java 匿名对象有引用,封闭对象的引用通过匿名类java进行转义

我在实践中阅读Java并发性,下面的例子来自于此.我的问题是这个参考逃脱是什么意思?会有什么问题? .这个引用是如何从doSomething(e)中逃脱的.public class ThisEscape {public ThisEscape(EventSource source) {source.registerListener(new EventListen…

7.25第一次组队赛

Problem A UVA 11877 The Coco-Cola Store 直接输出n/2 1 #include <stdio.h>2 int main()3 {4 int n;5 while(~scanf("%d",&n) && n)6 {7 printf("%d\n",n/2);8 }9 return 0; 10 } 也可以模拟 1 #include <stdio.h>2 int main()…

如何:优化Hive ZooKeeper Lock Manager实施

Hive一直使用ZooKeeper作为分布式锁定管理器来支持HiveServer2中的并发。 基于ZooKeeper的锁管理器在小型环境中运行良好。 但是&#xff0c;随着越来越多的用户从HiveServer迁移到HiveServer2并开始创建大量并发会话&#xff0c;可能会出现问题。 主要问题是Hiveserver2和ZooK…

java 类之间转换,java中类对象之间的类型转换

类似于基本数据类型之间的强制类型转换。存在继承关系的父类对象和子类对象之间也可以在一定条件之下相互转换。这种转换需要遵守以下原则&#xff1a;1.子类对象可以被视为是其父类的一个对象2.父类对象不能被当作是某一个子类的对象。3.如果一个方法的形式参数定义的是父类对…

重载和重写以及重写的权限问题

简单说重载是发生在一个类中 重写是发生在子父类中的继承情况中 重载Overloading 方法重载是让类以统一的方式处理不同类型数据的一种手段。具有同名函数同时存在&#xff0c;具有不同参数类型/个数。重载overloading是一个类中多态兴的一种表现。 java的方法重载&#xff0c;就…

《图解HTTP》第1章 了解Web及网络基础

《图解HTTP》第1章 了解Web及网络基础 1. 使用 HTTP 协议访问 Web1.1 网络基础 TCP/IP1.2 TCP/IP 协议族1.2.1 TCP/IP 的分层管理 1. 使用 HTTP 协议访问 Web Web 使用一种名为 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09; 的协议作为…

JBoss Forge NetBeans集成–入门

JBoss Forge是构建基于Maven的Java EE项目的最快方法。 因此&#xff0c;它已经具有了令人敬畏的功能&#xff0c;使您作为开发人员的生活更加轻松。 在大多数情况下&#xff0c;使用Forge的人们可能会对创建Web应用程序感兴趣。 有很多入门Forge基础的方法。 您可以查看quick…

java版本的getorcreate,getOrCreate for java-rest-api neo4j失敗

我有一個簡單的關係測試&#xff0c;我試圖運行使用Rest API創建一個獨特的節點(java-rest-binding)https://github.com/neo4j/java-rest-binding但不幸的是我被困在某些東西上&#xff0c;這裏是細節&#xff1a;(非唯一的節點和關係工作完全正常&#xff0c;與這一點&#xf…

Nifty JUnit:在方法和类级别上使用规则

如Nifty JUnit&#xff1a;使用临时文件一文中所示 &#xff0c;可以在JUnit测试中使用Rule &#xff0c;这是方法级别的规则。 在此示例中&#xff0c;我想显示ClassRule用于类级别规则的变体。 方法规则 Rule在测试类的每个测试方法&#xff08;就像Before &#xff09;之前…

SQL语法的重要知识点总结

好几年没写SQL语句了。现在到了新的team&#xff0c;需要用到数据库。作为QA的话时常需要使用客户端工具连接到数据库中找寻或修改数据。这么长时间没使用&#xff0c;一些SQL的使用技巧都忘得差不多了。晚上看了一些资料&#xff0c;花了1个多小时又捡起了曾经的知识。现在总结…

java语法定制混淆,由撇号混淆的textpad语法高亮显示

我想知道在textpad的语法文件中放置什么来修复问题&#xff0c;例如&#xff0c;在html文件中&#xff0c;你正在写一个段落&#xff0c;而撇号会创建语法高亮&#xff0c;直到下一个aspostrophe .例如&#xff1a;Hi, I m an example.lol text here placeholder lorem ipsum I…

您需要了解的有关默认方法的所有信息

因此&#xff0c;默认方法是……昨天的新闻&#xff0c;对不对&#xff1f; 是的&#xff0c;但是使用一年后&#xff0c;积累了很多事实&#xff0c;我想将这些事实收集在一个地方&#xff0c;供刚开始使用它们的开发人员使用。 甚至有经验的人都可以找到他们不知道的一两个细…

RAC+ASM在单机上恢复的过程

IT168技术文档】网上也有类似的例子&#xff0c;但不尽详细&#xff0c;也没多花心思解释流程及原因&#xff0c;可能对初试者不太解惑。有感于此&#xff0c;故认真整理了恢复步骤即操作流程&#xff0c;望有助于同行朋友。 环境&#xff1a;正式环境是IBM4IBM5(RAC)&#xf…

php event_base_new,php event拓展基本使用

php event拓展基本使用2019-02-04 22:02:28(527)1. 确定io复用类型(select/poll/epoll)php$cfg new EventConfig();$cfg->avoidMethod("select");$cfg->avoidMethod("epoll");$base new EventBase($cfg);$sig Event::signal($base, SIGTERM, func…

OSGi服务测试助手:ServiceRegistrationRule

OSGi服务测试可以有效避免与悬挂的服务引用有关的问题。 就像我在写简单服务贡献验证中所承诺的那样&#xff0c;这次我引入了一个JUnit规则 &#xff0c;该规则有助于测试组件之间的交互。 OSGi服务测试组件交互 假设我们有一个服务&#xff0c;该服务通知根据whiteboard-pat…

php 在函数里打开链接,JavaScript中打开链接的几种方法介绍

如何使用JavaScript打开链接&#xff1f;本篇文章我们就来看看使用JavaScript打开链接的几种方法介绍。我们先来看一段代码使用Javascript实现打开链接&#xff0c;需要在location.href中替换要打开的链接的URL。location.href http://www.php.cn/blog.html;通过上述代码我们可…