Guice - 在构造函数中使用注入字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Guice - 在构造函数中使用注入字段相关的知识,希望对你有一定的参考价值。

有没有办法可以在默认构造函数中使用注入的字段?以下是伪代码 -

public class SomeClass() {
    @Inject private SomeField someField;
    @Inject private SomeOtherField someOtherField;

    private SomeImportantObject someImportantObject;

    public SomeClass() {
        SomeBuilder
            .get()
            .withFieldValue( someField.getValue() )
            .withSomeOtherFieldValue( someOtherField.getValue() )
            .build();
    }
}

现在我面临的问题是,当我打电话给injector.getInstance( SomeClass.class )时,我得到了一个NullPointerException

Caused by: java.lang.NullPointerException
    at com.something.something.SomeClass.<init>(SomeClass.java:10)

现在我明白这种情况正在发生,因为默认构造函数是在依赖项注入之前调用的。

但是,有没有办法可以在之前注入依赖项? 或者,有更好的做法吗?

注意,我不想使用构造函数注入这些依赖项,因为我期望大约20-30个这样的字段。

答案

如果这些领域纯粹被SomeBuilder用来生产SomeImportantObject,那么:

  • 注入已经设置了那些字段的SomeBuilder实例,或者
  • 注入SomeImportantObject的实例。

我理解你希望避免使用过多论点来膨胀构造函数。在这种情况下,我会查看这些属性是否可以在逻辑上分组为几个(或单个)新类型,而不是作为构造函数参数传递。

另一答案

在无参数构造函数的情况下初始化之后,或者在具有参数的构造函数的情况下初始化时,依赖性只能实际注入。

这意味着,在当前状态下,您的代码不能与DI一起使用,因为您希望在初始化时构建一些东西。

当然,这引出了设计的问题;即使使用DI,这似乎也不是一个好主意。假设在初始化时,您的构建器引发了异常。你的对象将处于一个不稳定的部分初始化状态,对你来说并不完全有用。

有了这个,我强烈建议您将构建器移出构造函数。一旦它出来,那么无论你是否使用DI都没关系,DI模式(构造函数或字段或setter)对你有用。

以上是关于Guice - 在构造函数中使用注入字段的主要内容,如果未能解决你的问题,请参考以下文章

Guice 4.1教程

当他们的构造函数参数被依赖注入时如何实例化子演员?

如何在 playframework 中使用 guice 使用提供程序进行依赖注入

使用Dagger2做静态注入, 对比Guice.

JUnit测试中的Guice注入器[关闭]

构造函数注入与字段注入[重复]