我有一个 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;
}
}
然后我将接口(interface)绑定(bind)为:
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;
}
或者,我可以在静态主方法中创建注入(inject)器,如 Guice 教程中所示,并将实例保存在某处。
然后从我的网络服务执行如下操作:
Baz baz = Main.getInjector().getInstance(Baz.class);
但这看起来不太优雅,因为我必须传递我的注入(inject)器(在本例中通过为其提供静态 getter)。
还有别的办法吗?谢谢。
最佳答案
传递 Baz
对象的更优雅的方法是注入(inject)它。
例如,
public class BusinessService {
private final Baz baz;
@Inject
public BusinessService(Baz baz) { this.baz = baz; }
}
如果您想在 WS 中使用 BusinessService,请再次强调。
public class WebService {
private final BusinessService businessService;
@Inject
public WebService(BusinessService businessService) { this.businessService = businessService; }
}
通过这样做,所有依赖项都会在 API 签名中清楚地公开。
<小时/>剩下的问题是您必须在应用程序的入口点创建注入(inject)器。
在独立应用程序中,注入(inject)器通常在 main 方法中创建。
public static void main(String[] args) {
Injector injector = Guice.createInjector(new UtilModule(), new BusinessModule());
BusinessService businessService = injector.getInstance(BusinessService.class);
...
}
在 Web 应用程序中,注入(inject)器可能以不同的方式创建。这取决于框架。
Servlet:
...
关于java - Guice:使用注入(inject)器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26771480/