guice 实例_使用Google Guice消除实例之间的歧义
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消除实例之间的歧义相关推荐
- aws 删除ec2实例_如何在AWS EC2实例上部署Spring Boot应用程序
aws 删除ec2实例 你好朋友, 在本教程中,我们将看到如何在AWS EC2实例上部署Spring Boot应用程序. 这是我们将要执行的步骤. 1.使用Spring Boot Initialise ...
- rds 主从实例_探索Amazon RDS数据库实例和漏洞
Amazon Web Services(AWS)是构成Amazon云计算平台的远程计算服务的集合. 其中两项服务是: Amazon Simple Storage Service(S3),这是一种在线文 ...
- gan pytorch 实例_重新思考一阶段实例分割(Rethinking Single Shot Instance Segmentation)
点击上方"CVer",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:谢恩泽 https://zhuanlan.zhihu.com/ ...
- java对象实例_深入理解Java对象实例生成的例子!(转)
深入理解Java对象实例生成的例子!(转)[@more@]代码如下: class A { public int Avar; public A() { System.out.println(" ...
- codesys 串口通讯实例_常见的PLC程序实例,车库自动门的PLC控制!
点击箭头处"工业之家",选择"关注公众号"! PLC控制车库自动门实例 车库自动门控制 (1)明确系统控制要求 系统要求车库门在车辆进出时能自动打开关闭,车库门 ...
- mysql jndi 实例_自己收藏-JNDI应用实例
一.JNDI在Java EE中的应用 JNDI技术是Java EE规范中的一个重要"幕后"角色,它为Java EE容器.组件提供者和应用程序之间提供了桥梁作用:Java EE容器同 ...
- 亚马逊ec2 删除实例_学习使用Amazon EC2实例部署php应用程序
亚马逊ec2 删除实例 Learn about the Deployment of Web application using AWS 了解有关使用AWS部署Web应用程序的信息 Amazon EC2 ...
- 三菱modbusRTU通讯实例_三菱PLC通讯编程实例
FX系列作为三菱基本款的PLC,它们之间的通讯方式分别如下:CC-LINK,N:N网络连接,并联连接. 1.CC-LINK连接 CC-LINK连接图如下: 对应的PLC可为FX1N.FX1NC.FX2 ...
- pythonweb自动化测试实例_[转载]python webdriver自动化测试实例
python webdriver自动化测试初步印象 以下示例演示启动firefox,浏览google.com,搜索Cheese,等待搜索结果,然后打印出搜索结果页的标题 from selenium i ...
最新文章
- Dart简易教程 (1)---数据类型 运算符,类转换换
- 中断中是否可以使用信号量?
- ETH之Solidity:Solidity的简介、安装、使用方法之详细攻略
- Android源码分析--MediaServer源码分析(二)
- 合唱队(最长子序列问题)
- 数列分块入门 (1 ~ 7)
- 大学c语言项目,项目大学C语言程序设计期末复习重点.doc
- python高手养成_Python用PyQt5制作颜色对话框,PyQt图形界面编程之QColorDialog
- Python入门-Python中的包,impot,from,import
- win10和win7鲁大师测试软件,实测:老电脑用Win7、Win10哪个流畅?
- 7、固定资产减少凭证处理
- JQUERY本地自动保存插件Sisyphus.js
- html前端代码的初步实现(一)
- android USB OTG功能实现
- Android 模拟登陆正方教务系统(一)
- ZY-Player安静看电影
- 从第三方企业邮箱迁移至Office 365(21V) Exchange Online
- 【PTA|Python】浙大版《Python 程序设计》题目集:第五章
- 生产者与消费者(夜王与守夜人之间的斗争)
- 密码学之数字信封 Digital_Envelope(project完整代码)