Eclipse rcp Eclipse@Singleton创建了两次

Eclipse rcp Eclipse@Singleton创建了两次,eclipse-rcp,Eclipse Rcp,我有一颗持久的豆子 @Creatable @Singleton public class PersistentBean extends PersistentType { private final Helper helper; private final IEventBroker eventBroker; @Inject public PersistentBean(Helper helper, IEventBroker eventBroker) { this.help

我有一颗持久的豆子

@Creatable
@Singleton
public class PersistentBean extends PersistentType {

  private final Helper helper;
  private final IEventBroker eventBroker;

  @Inject
  public PersistentBean(Helper helper, IEventBroker eventBroker) {
    this.helper = helper;
    this.eventBroker = eventBroker;
  }

  @PostConstruct
  private void postConstruct() {
    setTaxYear(TaxYear.TY2013.toString());
  }

  // stuff ...
}
当Eclipse跟踪激活时,将调用两次此构造函数和postConstruct()。奇怪的是,这个类是@Singleton

setTaxYear()触发解组并要求助手计算分类结果

当Helper调用Provider.get()时,它接收null并崩溃。怎么回事?已经创建的单例bean正在调用它

提前谢谢你的建议,我看了相关的帖子没有成功, 戴夫

---格雷格的更新

public class PersistentBean extends PersistentType {

  public void setTaxYear(String taxYear) {
    unmarshal(taxYear);
  }

  private void unmarshal(String taxYear) {
    // Unmarshal file into jaxBean, works fine.
    PersistentType jaxBean = <elided>;
    // Copy jaxBean into this object's state, no problem.
    // Now update derived data (mucho problema).
    helper.updateTax();
  }
}

public class Helper extends AClass {

  private final Provider<PersistentBean> persistentProvider;
  private PersistentBean persistent;

  @Inject
  public Helper(Provider<PersistentBean> persistentProvider) {
    this.persistentProvider = persistentProvider;
  }

  BigDecimal updateTax() {
    if (persistent == null)
      persistent = persistentProvider.get();
    // Result is null, attempts to use cause NPE.
    // And sometimes (?) goes into infinite loop?
  }
}
公共类PersistentBean扩展PersistentType{
公共无效setTaxYear(字符串taxYear){
unmarshal(纳税年度);
}
私有无效解组(字符串纳税年度){
//将文件解组到jaxBean中,工作正常。
PersistentType jaxBean=;
//将jaxBean复制到此对象的状态,没有问题。
//现在更新派生数据(mucho问题)。
helper.updateTax();
}
}
公共类帮助程序扩展了AClass{
私有最终提供者persistentProvider;
私有PersistentBean persistent;
@注入
公共帮助程序(提供程序persistentProvider){
this.persistentProvider=persistentProvider;
}
BigDecimal updateTax(){
if(persistent==null)
persistent=persistentProvider.get();
//结果为空,尝试使用原因NPE。
//有时(?)进入无限循环?
}
}

这令人困惑。我所能想到的是@PostConstruct仍然在PersistentBean构造函数的上下文中运行,所以当Helper试图获取PersistentBean时,PersistentBean没有被正式创建?也许E4在@Singleton的构造函数和后构造函数都返回之前不知道@Singleton?使初始化状态变得有点困难。

如何创建
PersistentBean
?什么是
Provider.get()
?PersistentBean是使用data injection@InjectEverywhere创建的,除了在Helper中,它使用Provider来避免循环依赖。javax.inject.Provider具有方法get(),可以根据帮助器方法中的需要检索PersistentBean。如果助手在构造过程中试图检索其PersistentBean,结果是堆栈溢出,因为PersistentBean也注入了一个助手?我不清楚这是Eclipse4直接注入还是其他注入器框架之一。看见看起来Eclipse实现了与org.Eclipse.e4.core.internal.di.ProviderImpl的接口。是的,我知道。您没有向我们展示使用提供者的代码,这使得很难准确地确定发生了什么。