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

问题描述 投票:0回答:2

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

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个这样的字段。

java dependency-injection guice
2个回答
1
投票

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

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

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


1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.