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 - 在构造函数中使用注入字段的主要内容,如果未能解决你的问题,请参考以下文章