我想创建一个全局状态(数据对象,而不是服务对象)。
我创建了课程MyDataObject
。
我想避免定期的全球状态,
但更喜欢使用Guice
依赖注入。
然而,所有教程都展示了如何为注册到接口的服务对象设置DI。
如何根据需要使用Guice
注射?
修改
我试过了:
public class AppInjector扩展了AbstractModule {
@Override
protected void configure() {
bind(E2eResult.class).toInstance(new E2eResult());
}
}
使用:
@Test
public void sendSearchRequest() throws Exception {
...
e2eResult = injector.getInstance(E2eResult.class);
timerUtils.setTimeOut(criticalBlockTimeOutMilli);
timerUtils.startStopWatch();
...
long timeElapsed = timerUtils.stopStopWatch();
e2eResult.runTime = timeElapsed;
...
}
和
public static void main(String... args) throws ClassNotFoundException, IOException {
Injector injector = Guice.createInjector(new AppInjector());
Result result = runTest(classAndMethod);
E2eResult e2eResult = injector.getInstance(E2eResult.class);
}
然而我看到main
中没有新的长值。
答案 0 :(得分:4)
要注入GlobalState类,首先应该创建一个它的实例(根据需要设置它),然后将类绑定到实例:
bind(GlobalState.class)
.toInstance(globalState);
可以在“模块”中创建和配置GlobalState,您可以在这里阅读更多信息:
答案 1 :(得分:1)
所以你有一个普通的旧java对象GlobalState
:
public class GlobalState {
// whatever...
}
您可以使用guice提供的单例机制:
bind(GlobalState.class).in(Singleton.class);
或者使用实例绑定:
bind(GlobalState.class).toInstance(new GlobalState());
通过这种方式,您可以在应用程序中注入GlobalState
的唯一实例。
答案 2 :(得分:0)
我最终创造了一个“旧的”坏单身
无需特殊装订
因为我没有任何预加载的对象。
@Override
protected void configure() {
}
只携带一个唯一的guice注射器
public class InjectorSingleton {
public Injector guiceInjector;
private static InjectorSingleton singleton;
private InjectorSingleton() {
guiceInjector = Guice.createInjector(new AppInjector());
}
public static InjectorSingleton getInstance() {
if (singleton == null) {
singleton = new InjectorSingleton();
}
return singleton;
}
}
我从我的main class
和我的test class
InjectorSingleton.getInstance().guiceInjector.getInstance(MyDataObject.class);