如何使用guice实现全局状态?

时间:2014-12-16 10:38:56

标签: java dependency-injection inversion-of-control guice

我想创建一个全局状态(数据对象,而不是服务对象)。

我创建了课程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中没有新的长值。

3 个答案:

答案 0 :(得分:4)

要注入GlobalState类,首先应该创建一个它的实例(根据需要设置它),然后将类绑定到实例:

bind(GlobalState.class)
    .toInstance(globalState);

可以在“模块”中创建和配置GlobalState,您可以在这里阅读更多信息:

https://github.com/google/guice/wiki/GettingStarted

答案 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);