制作Guice注射器Singleton以保持一致性

时间:2011-04-13 16:50:45

标签: interface dependency-injection singleton runtime guice

我想知道如何使用注射器。我知道它主要用于启动时,但是如何在运行时使用它来创建某个实现的对象?

例如,我有一个User User,UserA,UserB和UserC的实现。我在运行时使用Guice的想法是将它包装在Singleton类中,这样我就可以检索它而不是每次想要创建User对象的实例时都创建一个新的注入器。

//Create in singleton wrapper class
Injector injector = Guice.createInjector(new SecurityModule());

//Retrieve and use at run-time (Manager is the singleton wrapper class)
Injector injector = Manager.getInstance().getInjector();
User user = injector.getInstance(User.class);

这是通常的做法吗?基本上,我想确保集中所有配置,以便减少错误(例如使用错误的模块)。它也更容易管理,所以如果我决定使用不同的配置模块,我可以在类中更改它,而不是在每个使用它的Java类中。

谢谢, 千斤顶

2 个答案:

答案 0 :(得分:2)

除非在极少数情况下,您不应该直接在应用程序中使用Injector,即使这样,您也绝对不应该将其设置为静态Singleton。如果您希望能够在应用程序中的某处使用Guice检索User的新实例,则只需注入Provider<User>并在需要时调用get()

答案 1 :(得分:1)

我会写:

public class Manager {
    private static Manager instance;
    // getInstance singleton method left out for brevity
    private Injector injector;
    private Manager() {
        injector = Guice.createInjector(...);
    }
    public <T> T get(Class<? extends T> cls) {
        return injector.getInstance(cls);
    }
}

所以你可以做到

Manager.getInstance().get(User.class)并且不必使用Guice的Injector,允许您在不更改应用程序代码的情况下更改依赖注入框架。