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

使用Guice在所有对象中注入实例

晋言
2023-03-14
class A {
    public A() {
    }
}

class B {
    @Inject
    @Named("A")
    private A a;

    public B() {
    }

    public A getA() {
        return a;
    }
}

class AModule extends AbstractModule {
    @Override
    protected void configure() {

    }

    @Provides
    @Singleton
    @Named("A")
    public A providesA() {
        return new A();
    }
}

我们是这样做的:

AModule module = new AModule();
Injector injector = Guice.createInjector(module);
B b = injector.getInstance(B.class);
System.out.println(sample.getA());

但是我们有很多类具有as依赖性,我们不想每次创建实例时都添加这些代码。

那么,有没有办法在创建B的实例时自动注入A的实例?

共有1个答案

芮岳
2023-03-14

按照您在问题中的建议,创建尽可能多的顶级喷油器(通常)是不正确的。创建注入器的成本很高,一旦Guice计算了依赖关系图,就不需要重新计算。一般来说,应用程序中应该有一个顶级注入器,其他任何注入器要么是“子注入器”,要么是单独的、不相关的对象图的一部分。

从“最差”到“最佳”:

如果要将DI引入大量现有或遗留代码,那么可能很容易将注入器隐藏到可公开访问的html" target="_blank">对象中。

public class InjectorHolder() {
  private InjectorHolder() {}  // Not instantiable

  private static Injector injector;

  public static void initializeInjector() {
    injector = Guice.createInjector(new AModule(), new BModule(), andSoOn());
  }

  public static Injector get() {
    return injector;
  }

  public static B getB() {
    return injector.getInstance(B.class);
  }
}

此时,您可以调用InjectorHolder。get()。getInstance(B.class)或InjectorHolder。getB()从您目前迁移的应用程序部分获取。请注意,这可能很难测试,并且直接依赖于整个应用程序中的Guice,这两种情况都不理想。

Guice为静态注入提供了一些特性,特别是方法调用requestStaticInjection(类…类型)。通过在模块中调用它,Guice将在创建注入器后立即注入带有@inject注释的静态成员。

public class StaticBModule extends AbstractModule() {
  @Override public void configure() { requestStaticInjection(BFactory.class); }
}

public class BFactory() {
  @Inject @Named("B") private static Provider<B> bProvider;

  public B get() {
    return bProvider.get();
  }
}

现在,您可以调用new BFactory(). get()而不是new B(),并且它都将进入同一个注入器。自然地,如果您放置一个静态提供程序,您也可以允许new B()

你也可以参考这个SO问题,它有一个例子。

您已经向我们展示了AB,但可能其他一些类C使用了B的许多实例,并且可能您的应用程序(其中包含您的静态main方法)使用了C。您可以使用Guice创建应用程序C的实例,然后C可以包含一个注入的提供程序

这样,您的类完全依赖于它们所依赖的内容,除了在顶层之外,没有静态状态或对Guice的引用。

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

  • 我正在开发一个现有的Java代码库,该代码库使用Guice进行依赖注入。我有一个新的类 Foo,其中包含一个我想注入的成员字段(bar)。喜欢这个: 然而,有两件事: 使用Foo的注射器无法直接进入 客户端希望使用“new”创建Foo 当客户端执行以下操作时,是否仍然可以将Bar注入Foo对象: 我对DI和Guice非常陌生,不太明白如何在不调用injector.createInstance()的

  • 我有 对于这个特性,我有多个实现。。。 根据给定的类型,我想从一个实现中选择。类似这样的东西(伪代码): 所以2点: > 如何注入trait“Builder”的所有实现??我发现了很多问题都是朝着同一个方向发展的(使用multibinder、TypeLiteral等,但没有一个问题涉及注入所有实现。这只是关于“如何注入特定的实现”),我知道如何使用multibinder绑定多个实例;但如果它是一个

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

  • 我正在努力实现DI,特别是使用guice的构造函数注入。我很难理解如何将泛型的类类型注入到构造函数中。 我的课程如下: 我可以在运行时使用guice将类的类型注入构造函数吗?简而言之,我可以使用guice注入Foo构造函数吗?

  • 问题内容: 我正在阅读Guice文档,并且遇到了一个标题为“ 消除周期”(推荐)的部分,这引起了我的极大兴趣,因为正是这个问题才导致我今天使用该文档。 基本上,要消除循环依赖性,您可以“将依赖性案例提取到单独的类中”。 好的,那里没有新内容。 因此,在示例中,我们有。 您有一个和一个,每个都需要引用的一个实例。这个概念没有问题,并且可以通过经典的依赖注入轻松实现: 这很容易,但是现在,我需要通过G