【发布时间】:2014-11-12 18:34:01
【问题描述】:
我有一个 Maven 模块,我在其中定义了一些在其他几个 Maven 模块之间共享的实用程序。 在这个模块中,我想创建一些单例:
package org.me.util;
public interface Baz {
String myMethod(String s);
}
@Singleton
public class Foo implements Baz {
private Bar bar;
@Inject
Foo(Bar bar) {
this.bar = bar;
}
@Override
public String myMethod(String s) {
return s;
}
}
然后我将我的界面绑定到:
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(Baz.class).to(Foo.class);
}
}
假设我想从另一个 Maven 模块(例如,一个 Web 服务)中使用这个单例,我该如何实现呢? 我发现的唯一方法是在我的 util Maven 模块中创建一个类,例如:
package org.me.util;
public class Main {
private static Injector injector = Guice.createInjector(new MyModule());;
public static Injector getInjector() {
return injector;
}
或者,我可以在 Guice 教程中看到的静态 main 方法中创建注入器,并将实例保存在某处。
然后从我的网络服务中执行以下操作:
Baz baz = Main.getInjector().getInstance(Baz.class);
但这似乎不太优雅,因为我必须传递我的注入器(在这种情况下,通过为其提供静态 getter)。
还有其他方法吗?谢谢。
【问题讨论】:
-
理想情况下,您还可以注入其他模块中的任何内容。你能
@Inject Baz baz然后从注入器中获取任何需要Baz的实例吗? -
我不确定我是否关注你。我正在使用 Guice 和 DI 迈出第一步。但是注入像@Inject Baz baz 这样的字段不是不好的做法吗?无论如何,我不明白我应该如何在不使用注入器的情况下获得我的单例实例。
-
对 - 您也可以注入到其他类的构造函数中。我要说的是,如果可能的话,你应该在你需要的地方
@Inject你的单身人士。 Guice 只有在创建对象时才能为您提供帮助。
标签: java dependency-injection guice