我想做这样的事情:
@Inject private CollectorsListHolderFactory collectorsListHolderFactory;
private CollectorsListHolder collectorsListHolder;
private String projectName;
private NodeInfo node;
@Inject
public CollectorsRunner(@Assisted String projectName, @Assisted NodeInfo node) {
super();
this.projectName = projectName;
this.node = node;
collectorsListHolder = collectorsListHolderFactory.create(projectName, node);
}
但我得到NullPointerException
,因为collectorsListHolderFactory
是null
。是否可以在不使用构造函数的情况下注入该成员?
答案 0 :(得分:2)
Assisted inject非常乐意注入字段,与Guice的其余部分一样,但是在调用构造函数之后它会发生。 (毕竟,它需要在设置其字段之前创建实例。)您可以这样做:
private final String projectName;
private final NodeInfo node;
private CollectorsListHolder collectorsListHolder;
@Inject
public CollectorsRunner(@Assisted String projectName, @Assisted NodeInfo node) {
this.projectName = projectName;
this.node = node;
}
@Inject
void injectCollectorsListHolderFactory(CollectorsListHolderFactory factory) {
this.collectorsListHolder = factory.create(projectName, node);
}
但如果可以的话,你应该完全avoid public injectable constructors。
答案 1 :(得分:1)
您是否尝试过以下操作?
private CollectorsListHolder collectorsListHolder;
private String projectName;
private NodeInfo node;
@Inject
public CollectorsRunner(@Assisted String projectName, @Assisted NodeInfo node,
CollectorsListHolderFactory collectorsListHolderFactory) {
super();
this.projectName = projectName;
this.node = node;
this.collectorsListHolder = collectorsListHolder;
}
您必须绑定模块中的collectorsListHolder才能使用btw。
答案 2 :(得分:0)
你可以尝试使用jice的JSR-250扩展,例如mycila或其他,并使用@PostConstruct注释。