我们的项目设置如下:
1) 主模块:包含启动 Spark 流服务器的驱动程序。它有自己的 Guice 注入(inject)器。
2) 当消息传入时,它会转到另一个模块,该模块创建自己的 Guice 注入(inject)器。
3) 该模块使用其他模块中的类,而这些模块本身也使用依赖模块。这些模块中的每一个都创建自己的 Guice 注入(inject)器,以便它可以独立工作、单独测试等。
这里有一个问题:现在我们需要一个 Singleton,但是作为 @Singleton 创建的对象绑定(bind)到注入(inject)器(而不是 ClassLoader),因此当注入(inject)器消失时,对象也会消失。
问题:
1)我们的架构不好吗?我们不应该在每个模块中创建一个注入(inject)器吗?
2)我们如何创建一个即使注入(inject)器消失后仍保留在类加载器中的单例?
顺便说一句,我们在 Guice 上使用 Netflix Governator。
注意:对被认为与此问题重复的问题的回答并没有回答如何将在顶级模块上创建的“单个”注入(inject)器传递到子模块。另外,如果子模块本身没有注入(inject)器,我们可以为它们编写独立的单元测试吗?
最佳答案
问题 2 的一个想法是使用一个可以在所有不同模块中绑定(bind)的提供程序。该提供者将访问存在于 Guice“外部”的单例。
我制作了一个简单的示例,其中提供对静态字段的访问。您可以更改它以使用适合您需求的单例模式的实现。
public class SingletonProvider implements Provider<TheSingleton> {
private static final TheSingleton instance = new TheSingleton();
@Override
public TheSingleton get() {
return instance;
}
}
然后我们将其绑定(bind)到不同的模块
public class Module1 extends AbstractModule {
@Override
protected void configure() {
bind(TheSingleton.class).toProvider( SingletonProvider.class);
}
}
public class Module2 extends AbstractModule {
@Override
protected void configure() {
bind(TheSingleton.class).toProvider( SingletonProvider.class);
}
}
然后我创建两个不同的注入(inject)器返回同一个实例
public class Test {
public static void main(String[] args) {
Injector injector1 = Guice.createInjector(new Module1());
TheSingleton instance = injector1.getInstance(TheSingleton.class);
System.out.println("instance = " + instance);
Injector injector2 = Guice.createInjector(new Module2());
TheSingleton instance2 = injector2.getInstance(TheSingleton.class);
System.out.println("instance2 = " + instance2);
}
}
关于java - 创建不与注入(inject)器绑定(bind)的 Guice 单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33249223/