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

guice 实例

guice 实例_使用Google Guice消除实例之间的歧义相关推荐

  1. aws 删除ec2实例_如何在AWS EC2实例上部署Spring Boot应用程序

    aws 删除ec2实例 你好朋友, 在本教程中,我们将看到如何在AWS EC2实例上部署Spring Boot应用程序. 这是我们将要执行的步骤. 1.使用Spring Boot Initialise ...

  2. rds 主从实例_探索Amazon RDS数据库实例和漏洞

    Amazon Web Services(AWS)是构成Amazon云计算平台的远程计算服务的集合. 其中两项服务是: Amazon Simple Storage Service(S3),这是一种在线文 ...

  3. gan pytorch 实例_重新思考一阶段实例分割(Rethinking Single Shot Instance Segmentation)

    点击上方"CVer",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:谢恩泽 https://zhuanlan.zhihu.com/ ...

  4. java对象实例_深入理解Java对象实例生成的例子!(转)

    深入理解Java对象实例生成的例子!(转)[@more@]代码如下: class A { public int Avar; public A() { System.out.println(" ...

  5. codesys 串口通讯实例_常见的PLC程序实例,车库自动门的PLC控制!

    点击箭头处"工业之家",选择"关注公众号"! PLC控制车库自动门实例 车库自动门控制 (1)明确系统控制要求 系统要求车库门在车辆进出时能自动打开关闭,车库门 ...

  6. mysql jndi 实例_自己收藏-JNDI应用实例

    一.JNDI在Java EE中的应用 JNDI技术是Java EE规范中的一个重要"幕后"角色,它为Java EE容器.组件提供者和应用程序之间提供了桥梁作用:Java EE容器同 ...

  7. 亚马逊ec2 删除实例_学习使用Amazon EC2实例部署php应用程序

    亚马逊ec2 删除实例 Learn about the Deployment of Web application using AWS 了解有关使用AWS部署Web应用程序的信息 Amazon EC2 ...

  8. 三菱modbusRTU通讯实例_三菱PLC通讯编程实例

    FX系列作为三菱基本款的PLC,它们之间的通讯方式分别如下:CC-LINK,N:N网络连接,并联连接. 1.CC-LINK连接 CC-LINK连接图如下: 对应的PLC可为FX1N.FX1NC.FX2 ...

  9. pythonweb自动化测试实例_[转载]python webdriver自动化测试实例

    python webdriver自动化测试初步印象 以下示例演示启动firefox,浏览google.com,搜索Cheese,等待搜索结果,然后打印出搜索结果页的标题 from selenium i ...

最新文章

  1. Dart简易教程 (1)---数据类型 运算符,类转换换
  2. 中断中是否可以使用信号量?
  3. ETH之Solidity:Solidity的简介、安装、使用方法之详细攻略
  4. Android源码分析--MediaServer源码分析(二)
  5. 合唱队(最长子序列问题)
  6. 数列分块入门 (1 ~ 7)
  7. 大学c语言项目,项目大学C语言程序设计期末复习重点.doc
  8. python高手养成_Python用PyQt5制作颜色对话框,PyQt图形界面编程之QColorDialog
  9. Python入门-Python中的包,impot,from,import
  10. win10和win7鲁大师测试软件,实测:老电脑用Win7、Win10哪个流畅?
  11. 7、固定资产减少凭证处理
  12. JQUERY本地自动保存插件Sisyphus.js
  13. html前端代码的初步实现(一)
  14. android USB OTG功能实现
  15. Android 模拟登陆正方教务系统(一)
  16. ZY-Player安静看电影
  17. 从第三方企业邮箱迁移至Office 365(21V) Exchange Online
  18. 【PTA|Python】浙大版《Python 程序设计》题目集:第五章
  19. 生产者与消费者(夜王与守夜人之间的斗争)
  20. 密码学之数字信封 Digital_Envelope(project完整代码)

热门文章

  1. jzoj3846-七天使的通讯【二分图判定】
  2. OJ4008-糖果【各种dp之3】
  3. 【二分】数列分段(ybtoj 二分-1-1)
  4. 2017上海金马五校 购买装备 贪心+二分Check
  5. Spark SQL(八)之基于物品的相似度公式
  6. Oracle入门(十二E)之视图操作
  7. 学习java多线程,这必须搞懂的这几个概念
  8. ajax读取.txt文件出现乱码
  9. 【博客】csdn搬家到wordpress
  10. “老师,我不要苹果味的,我要葡萄味的”!