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的接口。是的,我知道。您没有向我们展示使用提供者的代码,这使得很难准确地确定发生了什么。