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

时间:2018-08-27 21:37:43

标签: java dependency-injection 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个此类字段。

2 个答案:

答案 0 :(得分:1)

如果这些字段是纯粹由SomeBuilder注入以产生SomeImportantObject的,则:

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

我了解您希望避免给构造函数添加太多参数而使其膨胀的愿望。在这种情况下,我将查看这些属性是否可以在逻辑上分组为几个(或单个)新类型,而不是作为构造函数参数传递。

答案 1 :(得分:1)

只有在无参数构造函数的情况下,才能在 初始化后实际注入依赖项,而在有参数的构造函数的情况下,只能在 at 初始化条件下注入。 >

这意味着在当前状态下,您的代码无法与DI配合使用,因为您想在初始化时构建一些东西。

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

基于此,我 鼓励您将构建器移出构建器。一旦发布,无论您是否使用DI都没关系,并且 DI模式(构造函数,字段或设置程序)都将为您工作。