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

使用Guice创建同一类的多个实例

柴翰藻
2023-03-14

对不起,如果这是一个微不足道的问题,我是新的指南。假设我有下面这个类:

public class MyClass {
     @Inject
     public MyClass(final MyDependency myDependency) {
          this.name = myDependency.getName();
     }

     public String getName() {
          this.name;
     }
}

然后在其他地方我想做:

public class SomeOtherClass {
    public void test() {
        MyClass instanceFoo = injector.getInstance(MyClass.class);
        MyClass instanceBar = injector.getInstance(MyClass.class);

        assertTrue("foo", instanceFoo.getName());
        assertTrue("bar", instanceBar.getName());
    }
}

我希望有两个“MyClass”实例,一个名为“foo ”,一个名为“bar ”(也就是说,它们中的每一个都有一个不同的依赖实例)。我如何将这两个实例添加到我的注入器中,如何用“injector.getInstance”检索它们中的每一个?

我不想为每个可能的依赖项创建一个“MyClass”的子类。

谢谢你!

共有1个答案

锺离声
2023-03-14

您的问题,如标题所示,有一个更简单的解决方案:如果你想要任意数量的MyClass或MyDependency实例,你可以注入一个提供程序

与问题的主体一样,有两个部分:为同一个<code>类</code>创建多个可注入的<code>键</code>,以及使用不同的名称和注入的依赖项按照您想要的方式设置实例。

Guice使用< code>Key标识绑定,它是一个完全限定的类(如< code>MyClass或< code>List

大多数情况下,您可以不直接使用Key:在< code>bind调用中使用< code>annotatedWith,或者将注释添加到< code>@Provides方法中,并通过将注释放在构造函数参数或@ Inject-annoted字段中来请求它们。但是,您仍然可以通过使用Key上的静态方法手动创建一个键来使用< code>getInstance和< code>getProvider。(对于复杂的情况,使用TypeLiteral或< code > names . named ;详情见他们的文档。)

现在您知道了如何注入@命名("foo")Myclass@Foo Myclass,您如何提供它们?根据您的需要,我会选择三个选项之一:绑定toInance、使用@提供方法或创建“辅助注入”工厂。

>

  • 如果您的MyClass实例本身不需要注入,并且您不需要改变或操纵实例状态,您可以根据需要准备命名的实例,然后用toInstance将它们绑定到

    您还可以编写一个 @Provides @Named(“foo”) MyClass 方法,该方法采用 MyClass 参数(Guice 通过注入器提供),设置名称并返回实例。这是编写提供程序类或实例的低开销替代方法,将为您提供一个新实例,而不是 toInstance 绑定所暗示的共享。

    如果您真的希望< code>name成为您的类的构造函数参数的一部分,也许是为了保持实例不变,您可以使用“辅助注入”来告诉Guice哪些参数是您自己提供的,哪些参数来自Guice注入器。这将允许您注入一个< code>MyClass。Factory,并调用< code > myclassfactory . create(" foo "),这可以直接在您的消费类中完成,或者使用上面的< code>@Provides技术。细节稍微超出了问题的范围,但是请查阅“辅助注入”以获得关于语法和添加适当JAR的细节。

  •  类似资料:
    • 我们已经使用Google Guice框架进行依赖注入。我需要在Java创建一个接口的多个insatnce。 执行从这里开始:下面代码中的KFHRecordValidator.java类: process类具有RecordValidationHelper类的引用,并且注入是通过构造函数进行的。iRecordValidationService.java是一个具有validate方法的接口。 类处理器有

    • 问题内容: 您能否获得2个具有相同基础类型的单例实例? 在春季,这显然是微不足道的,因为它基于您将范围附加到其上的命名实例,但是我看不到关于将类型绑定到实现类的指南。请注意,由于有问题的实例通过guice注入了其他依赖项,因此我不想绑定到该实例。 问题答案: Guice也很容易!创建两个招标注解,说和,然后 然后

    • 我有一个名为“消费者”的界面。 实现如下所示: } 我需要有2个consumerImpl类的实例,但要注入不同的DBManager实现。如何通过guice配置?

    • 我有一组验证器类,它们都扩展了一个公共抽象类,它们都具有相同的构造函数 我想要Guice的能力 < li >知道如何构造所有这些验证器,将相同的数据源注入所有这些验证器中 < li >使用多绑定器将所有验证器注入到一个类中 通过一些谷歌搜索,看起来我可以使用,但问题是如果我想这样做,我必须为每个验证器创建一个工厂,这是一个巨大的样板。因为他们都有相同的构造函数,我觉得一定有更好的方法。我的对象是在

    • 问题内容: 我有一个自动相互连接的Spring bean图。大大简化了图示: 所有这些bean都没有指定范围,这暗示它们是单例(使它们成为显式单例不会改变任何东西,我已经尝试过)。 问题在于,在实例化 单个应用程序上下文之后 ,的实例和包含的 不同 实例。怎么会这样 我试图为它创建public no args构造函数,并且调试已确认创建了多次。所有这些创建的堆栈跟踪都在这里。 我还尝试过为Spri

    • 我有一张相互自动连线的Spring豆图。高度简化的插图: 所有这些bean都没有指定作用域,这意味着它们是单例(我已经尝试过了,让它们显式单例不会改变任何东西)。 问题是,在实例化单个应用程序上下文之后,Bar和Baz的实例包含不同的Foo实例。这怎么会发生? 我尝试为创建公共no args构造函数,并且调试已确认已多次创建。所有这些创建的堆栈跟踪都在这里。 我还尝试为Spring启用调试日志记录