当前位置: 首页 > 面试题库 >

吉斯:根据谁来注入不同的实现?

龚招
2023-03-14
问题内容

我有两个第三方类,它们都采用Authorizer接口的实现。我需要为每个注入不同的实现。

如果执行@Provides,如何实现它,以便它在运行时提供所需的实现?提供者不知道谁在请求注射。

从理论上讲,我可以使用@Named,但不能修改正在注入的代码。我想做类似的事情:

bind(Authorizer.class).to(ImplA.class).for(SomeClass.class)
bind(Authorizer.class).to(ImplB.class).for(SomeOtherClass.class)

显然,“ for”代码不存在,但是有某种等效的方法吗?


问题答案:

您可以使用专用模块来实现此目的,该模块允许您安装(相互不可访问)冲突的绑定,以用于构造有限的一组非冲突的
公开
绑定。这通常被视为一个解决机器人的腿的问题,在其中您会希望(例如)揭露@Left Leg@Right Leg其中Leg对象是完全一样的,但是你已经绑定不同的Foot实现(LeftFootRightFoot)在层次结构进一步下跌。

在这一点上,您没有指定“谁在得到它”,但是您要为一个消费者和另一个消费者公开一个稍微不同的Injector图。

install(new PrivateModule() {
  bind(Authorizer.class).to(ImplA.class);
  expose(SomeClass.class);
});
install(new PrivateModule() {
  bind(Authorizer.class).to(ImplB.class);
  expose(SomeOtherClass.class);
});


 类似资料:
  • 我有一个存储库接口,它有两个实现。一个从本地存储的CSV文件读取数据,另一个从亚马逊迪纳摩数据库读取数据。我希望能够根据应用程序属性或自定义构建配置文件在我使用的实现之间切换。我通常会在运行时使用工厂来检索正确的类,但是如果可能的话,我希望通过注入来实现这一点。 我在使用Spring boot时发现了一个类似的问题,但在运行时找不到在Quarkus Spring choose bean实现中适用的

  • 我定义了同一个类的两个bean: 和另一个原型作用域bean: Spring应用程序上下文是否可能在没有可用请求时自动注入正确的bean?我希望在web上下文(例如在controller中)中获取bean时被注入,并希望在没有web上下文时被注入(例如,当我通过Quartz调度器运行一些代码时)。 我非常希望坚持使用的一个bean定义,因为将有许多不同的bean需要类似的行为,因此在我的情况下使用

  • 问题内容: 我试图将带注释的变量注入REQUEST范围: 其中,InjectingCallable将GetModule注入REQUEST范围内: GetModule的定义如下: 当我运行此代码时,出现以下错误: 如果我将相同的变量绑定到全局作用域,它将起作用。如果我删除了注释,它将起作用。此问题似乎特定于请求范围的带注释的变量。有任何想法吗? 问题答案: 问题是您没有此类型的绑定。仅仅因为您显式地

  • 问题内容: 我正在使用Guice(v 3.0),并且具有一个将被注入到构造函数中的值。该值可以为null,因此我已在构造函数中使用@Nullable注释了该参数(来自javax.annotations)。 但是,Guice在初始化类时抱怨配置错误: 我不明白为什么这行不通,还有什么需要做的吗? 问题答案: 原来是个日食问题-没有正确刷新我的工作区。

  • 我在实施辅助注射时遇到了错误。 辅助注射一直有效,直到我引入了另一个名为管理器的类,它依赖于辅助类。经理想要使用代码在构建喷油器图时中断。它没有更进一步。 直觉上,我理解当对象A得到帮助时,那么B(依赖于A)实际上也通过A得到了隐含的帮助。 请注意,我检查过了。我想像ColinD这样的人肯定知道答案如何使用Guice的AssistedInject?如何将辅助注入类绑定到接口? 出于好奇,有没有好的

  • 如何在中按不同的值获取行? 例如,我有下面的数据框: 我想根据 中的唯一值获取行: 那么,我怎样才能得到呢?如果有人可以提供任何帮助,我将不胜感激。