Guice:一个“Provider”用于多种实现

2023-11-30

我有一个包含 20 个左右带注释的实现的接口。如果我在编译时知道需要哪个,我可以注入正确的,但现在我需要根据运行时参数动态注入一个。

据我了解文档,我将不得不使用 20 左右Provider<T>注射然后使用我需要的药物,这对我来说似乎有点过分了。有没有办法拥有类似的东西inst(Provider<T>).get(MyAnnotation.class)绑定一个特定的实现,然后只有那个Provider注入我的班级?


注入一个地图绑定器.

在您的模块中,将绑定加载到MapBinder,然后使您的运行时参数也可注入。此示例基于文档中的示例:

public class SnacksModule extends AbstractModule {
  protected void configure() {
    MapBinder<String, Snack> mapbinder
           = MapBinder.newMapBinder(binder(), String.class, Snack.class);
    mapbinder.addBinding("twix").to(Twix.class);
    mapbinder.addBinding("snickers").to(Snickers.class);
    mapbinder.addBinding("skittles").to(Skittles.class);
  }
}

然后,在您的对象中注入Map和参数。对于这个例子,我假设你已经绑定了java.util.Properties对于您的运行时参数:

@Inject
public MyObject(Map<String, Provider<Snack>> snackProviderMap, Properties properties) {
  String snackType = (String) properties.get("snackType");
  Provider<Snack> = snackProviderMap.get(property);
  
  // etc.
}

注意,用同样的MapBinder你可以注入一个简单的Map<String, Snack> or a Map<String, Provider<Snack>>;吉斯将两者结合在一起。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Guice:一个“Provider”用于多种实现 的相关文章

随机推荐

  • 禁用错误的打字稿错误

    我已经使用 jspm 安装了 interact js 以及 npm 以便打字稿满意 该应用程序运行良好 但我的代码显示错误 import interact from interact js interact gt typescript er
  • Android计算Horizo​​ntalScrollView中的scrollTo位置

    我有 Horizo ntalScrollView 和几个 TextView 每个 TextView 可能包含不同长度的文本 我应该如何计算使用 scrollTo x y 滚动到的正确偏移量 滚动有效 但与预期不同 我已经尝试了各种方法 每个
  • 翻译我的主题的 function.php 文件中的自定义标签字段

    在社区的帮助下 我成功创建 保存标签及其值并将其打印到单个产品页面 我还可以使用将输入值翻译成不同的语言Polylang 但是翻译自定义标签 条件和品牌 非常困难 有人可以帮助我解决这些问题吗 我尝试使用Polylang Saywhat 没
  • 用php动态创建zip

    使用 php 创建动态 zip 文件的最简单方法是什么 例如 我在服务器上有这些文件 Root gt Folder 1 gt file1 wav Root gt Folder 2 gt file2 jpg 我想创建一个包含这两个文件的 zi
  • +Android Webview - 如何自动滚动页面?

    我想在网络视图中打开一个html页面 并使其根据通过计时器设置的时间间隔自动向下滚动 虽然下面的示例适用于桌面 但此链接应该让您了解我想要实现的目标 在页面的右上方启用自动滚动 example 首先 我考虑打开一个网页 然后使用某种可以模拟
  • Sed/Awk 删除第二次出现的字符串 - 平台无关

    我正在 bash 中寻找一行既适用于 linux 又适用于 OS X 的行 以删除包含所需字符串的第二行 Header 1 2 Header 10 11 应该成为 Header 1 2 10 11 我的第一次尝试是使用 sed 的删除选项
  • 如何在 Google 地图中设计高尔夫球场(沙丘和果岭)?

    我目前正在使用时髦的地图超轻主题设计我的 Google 地图 人们所期望的造型 景观 影响高尔夫球场 featureType landscape elementType geometry stylers color f5f5f5 light
  • 如何在Azure Blob上实现快速搜索?

    我已完成编写将文件 文本文件 上传到 azure blob 存储的代码 现在我想提供基于文本文件内容的搜索 对于前 如果我搜索 Hello 那么包含 Hello 单词的文件名应该出现在搜索结果中 这是我要搜索的代码 class BlobSe
  • Javascript 到 csv 导出编码问题

    我需要将 javascript 数组导出到 Excel 文件并下载它 我正在这段代码中执行此操作 data 是一个 JavaScript 对象数组 var csvContent data text csv charset utf 8 dat
  • 避免在jetpack compose中的嵌套列中进行重组

    我正在 jetpack compose 中的嵌套列上工作 我有一个列表 其中包含来自服务器的大量数据 我在布局检查器中进行了检查 我发现每当我的项目添加到列表中时 它都会重新组合并增加计数 所以我的疑问是 如果我在列表中一一添加 100 个
  • 在 C# 中将值从一种形式传递到另一种形式

    我必须通过id从 C 中的一种形式到另一种形式 我无法做到这一点 C 代码是 private void btnedit Click object sender EventArgs e foreach DataGridViewRow a in
  • 通过反射确定派生类

    我想处理从类 A 派生的类的方法 类 A 和派生类驻留在不同的程序集中 我使用反射从派生程序集中获取所有 System Type 并迭代它们的方法 Assembly A class Template Assembly B class X A
  • 无法使用 SSH 隧道将 MongoDB Compass 连接到 AWS DocumentDB

    我是 mongoDB 新手 试图为我的新项目设置工具 我的大部分基础设施都在 AWS 上运行 因此我更喜欢使用 AWS documentDB 我设法通过 mongo 客户端或 NodeJS 应用程序从 EC2 连接到 documentDB
  • HTML 文档的 head 元素内可以有 div 标签吗?

    只是想知道是否可以在 head 元素内添加 div 标签 No div 不是位于其中的有效标签标签 因为标签仅适用于元数据 例如标题和页面描述 脚本 样式和其他不打算显示的内容 虽然将其放入有效 这样做很糟糕 你不应该把它放在那里 规范说这
  • Python:从 urllib2.urlopen 调用获取 HTTP 标头?

    Does urllib2当 a 时获取整个页面urlopen已拨打电话 我只想读取 HTTP 响应标头而不获取页面 看起来像urllib2打开 HTTP 连接 然后获取实际的 HTML 页面 或者它只是开始缓冲页面urlopen call
  • Haskell“没有实例”错误

    我正在尝试编写一个函数来检查数字是否为素数 我写了这个 primeCheck Int gt Int gt Bool primeCheck n i n 2 True i 1 True n mod i 0 False otherwise pri
  • Google 图表 - 单击图例键时隐藏线条

    我希望在单击图例中的相关键时能够显示 隐藏折线图上的线条 这可能吗 要隐藏 GWT 可视化折线图上的显示线 请按照下列步骤操作 1 基于现有的DataTable对象创建DataView对象 DataTable dataTable DataT
  • 使用 matplotlib 具有多种颜色的颜色轴脊柱

    是否可以使用 python 中的 matplotlib 对轴脊柱进行多种颜色着色 所需的输出风格 您可以使用LineCollection创建一个五彩线 然后 您可以使用 x 轴变换将其固定在 x 轴上 而与 y 限制无关 设置实际脊柱不可见
  • 有没有办法在 Rust 中创建指向方法的函数指针?

    例如 struct Foo impl Foo fn bar self fn baz self fn main let foo Foo let callback foo bar error E0615 attempted to take va
  • Guice:一个“Provider”用于多种实现

    我有一个包含 20 个左右带注释的实现的接口 如果我在编译时知道需要哪个 我可以注入正确的 但现在我需要根据运行时参数动态注入一个 据我了解文档 我将不得不使用 20 左右Provider