Java Guice-在构造函数内部使用注入字段
有没有一种方法可以在默认构造函数中使用注入字段?下面是伪代码-Java Guice-在构造函数内部使用注入字段,java,dependency-injection,guice,Java,Dependency Injection,Guice,有没有一种方法可以在默认构造函数中使用注入字段?下面是伪代码- public class SomeClass() { @Inject private SomeField someField; @Inject private SomeOtherField someOtherField; private SomeImportantObject someImportantObject; public SomeClass() { SomeBuilder
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)
原因:java.lang.NullPointerException
在com.something.something.SomeClass.(SomeClass.java:10)
现在我明白了这是因为在注入依赖项之前调用了默认构造函数
但是,以前有没有办法注入依赖项?或者,有没有更好的方法 注意,我不想使用构造函数注入这些依赖项,因为我预计大约有20-30个这样的字段
如果注入这些字段纯粹是为了让
SomeBuilder
生成SomeImportantObject
,那么:
- 插入已设置了这些字段的
实例,或SomeBuilder
- 注入
的实例SomeImportantObject
我理解您希望避免使用太多参数使构造函数膨胀的愿望。在这种情况下,我想看看这些属性是否可以逻辑地分组为几个(或单个)新类型,而不是作为构造函数参数传递。如果这些字段被注入纯粹是为了被
SomeBuilder
用来生成SomeImportantToObject
,那么:
- 插入已设置了这些字段的
实例,或SomeBuilder
- 注入
的实例SomeImportantObject
我理解您希望避免使用太多参数使构造函数膨胀的愿望。在本例中,我将查看这些属性是否可以在逻辑上分组为几个(或单个)新类型,而不是作为构造函数参数传递。对于无参数构造函数,依赖关系只能在初始化后实际注入,对于带参数的构造函数,依赖关系只能在初始化时注入 这意味着,在当前状态下,您的代码将无法与DI一起工作,因为您希望在初始化时构建一些东西 当然,这就引出了设计的问题;即使使用DI,这似乎也不是一个好主意。假设在初始化时,构建器抛出了一个异常。您的对象将处于不稳定的部分初始化状态,并且它对您不会完全有用
有鉴于此,我强烈地鼓励您将构建器移出构建器。一旦退出,那么不管您是否使用DI,DI模式(构造函数、字段或setter)都可以为您工作。只有在无参数构造函数初始化后,或者在带参数的构造函数初始化时,才能实际注入依赖项 这意味着,在当前状态下,您的代码将无法与DI一起工作,因为您希望在初始化时构建一些东西 当然,这就引出了设计的问题;即使使用DI,这似乎也不是一个好主意。假设在初始化时,构建器抛出了一个异常。您的对象将处于不稳定的部分初始化状态,并且它对您不会完全有用 有鉴于此,我强烈地鼓励您将构建器移出构建器。一旦它出来了,不管您是否使用DI,DI模式(构造函数、字段或setter)都适合您