我有一个名为Legacy的现有课程,该课程主要以旧式单例模式编写。现在,我想向它介绍一个新领域,我想使用Guice。 Legacy本身不受Guice的控制,它由另一个Service类使用(在Service类内部,它调用Legacy类的getInstance()以立即检索Legacy对象),并且该服务类是使用Guice注入器创建的。
public class Legacy {
public synchronized static Legacy getInstance() {
if(sInstance == null) {
sInstance = new Legacy();
}
return sInstance;
}
private Legacy() {
legacyObj = LegacyField.getInstance(); // get a singleton
}
private static Legacy sInstance;
private LegacyField legacyObj;
private NewField newObj; // this is the new dependency I would like to add using Guice
}
我尝试的是尝试将方法Inject放入Legacy类中
@Inject
public void setNewField(NewField newObj) {
this.newObj = newObj;
}
在Service的模块文件中,我绑定了NewField对象,但是当我运行该程序时,它抛出了NullPointer异常。因此,注入操作无效。关于如何使NewField注入我的程序但保持当前的老式单例范例并且在其他所有方面都没有太多改变的想法?
编辑
下面至少有三个解决方案,我不太清楚哪个是最好的,或者它们是等效的。
最佳答案
我刚刚找到了另一个解决方案:
// put in the module
bind(Legacy.class).toInstance(Legacy.getInstance());
在此示例中,您的模块本身而非Guice负责获取Legacy实例,然后要求Guice始终使用该单个实例来满足所有Legacy注入请求。
但是根据javadoc
创建Injector后,它将自动为此实例执行字段和方法注入,但是Legacy上的任何可注入构造函数都将被忽略。请注意,使用这种方法会导致无法控制的“紧急加载”行为。