是否可以使用AssistedInject注入构造函数以外的成员?

时间:2014-11-13 15:00:57

标签: java guice

我想做这样的事情:

@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,因为collectorsListHolderFactorynull。是否可以在不使用构造函数的情况下注入该成员?

3 个答案:

答案 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注释。