我想知道如何使用注射器。我知道它主要用于启动时,但是如何在运行时使用它来创建某个实现的对象?
例如,我有一个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类中。
谢谢, 千斤顶
答案 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,允许您在不更改应用程序代码的情况下更改依赖注入框架。