当前位置: 首页 > 知识库问答 >
问题:

注入对象而不访问Guice中的注入器

沙岳
2023-03-14

我正在开发一个现有的Java代码库,该代码库使用Guice进行依赖注入。我有一个新的类 Foo,其中包含一个我想注入的成员字段(bar)。喜欢这个:

public class Foo {
    @Inject
    private Bar bar;
}

然而,有两件事:

  1. 使用Foo的注射器无法直接进入
  2. 客户端希望使用“new”创建Foo

当客户端执行以下操作时,是否仍然可以将Bar注入Foo对象:

myFoo = new Foo();

我对DI和Guice非常陌生,不太明白如何在不调用injector.createInstance()的类或容器类的情况下注入对象。在我的测试中,它似乎不起作用。

共有2个答案

翟单弓
2023-03-14

使用 Guice,如果您有对注入器的引用,您可以强制注入字段。喜欢这个:

injector.injectMembers(fooObject);

您的第一点是,您无法访问使用Foo的注射器。你可以尝试解决这个问题,给Foo一个注入器的静态引用。

public class Foo {
  @Inject private static Injector injector;

  @Inject
  private Bar bar;

  public Foo() {
    injector.injectMembers(this);
  }
}

但是等等,这开箱即用,因为注入器字段只是空。您还需要注入它,但由于它是一个静态字段,您只需执行一次。它被称为静态注入。可能在应用程序启动时,您可以在任何 guice 模块中访问 Guice 注入器。

在那里,您只需执行以下操作:

requestStaticInjection(Foo.class)
逄嘉禧
2023-03-14

如果您自己通过“新建”创建实例,则DI工具不起作用。这不是特定于指导的。所以,除非你放弃约束“2”,否则你的日子会很难过。

 类似资料:
  • 在Scala中,我可以使用Guice注入Scalas吗? 例如,我可以在以下对象中注入?

  • 首先,我不得不说,我试着用谷歌搜索这个问题的答案,但没有任何答案可以解释我的怀疑。总之,我想了解的是: 此接口有两种不同的实现: 我将在以下示例中使用这些实现: 更新1.1至帖子 我还有一个类使用相同的“动物”界面: 所以我的问题是:1-我如何知道将向AnimalStateManager注入什么实现?2-如果我想强迫“AnimalStateManager”上的“动物”对象成为猫,该怎么办? 更新1

  • 我正在使用 scala play 2.5,在尝试在我的一个控制器中注入对象时出现以下错误。我正在使用 play 给出的默认注入框架,即 Guice。 这是控制器: 以下是我想注入的服务: 这就是我使用它的方式:

  • 我们是这样做的: 但是我们有很多类具有as依赖性,我们不想每次创建实例时都添加这些代码。 那么,有没有办法在创建B的实例时自动注入A的实例?

  • 我正在尝试使用Guice 3.0,它不会实例化工厂。 SSCCE代码: < code>BarImpl与< code>FooImpl非常相似。这里出了什么问题?还要注意,我在这里尝试了< code>@AssistedInject和< code>@Inject,两者都会导致错误。 输出: 请注意,第 9 行是对 的第一次调用的行

  • 主要内容:Google Guice 按需注入 示例,输出注入是将依赖注入对象的过程。方法和字段注入可用于使用injector.injectMembers()方法使用退出对象进行初始化。请参阅下面的示例。 Google Guice 按需注入 示例 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java 输出 编译并运行该文件,您将看到以下输出。