我有一个Maven模块,我在其中定义了一些与其他几个Maven模块共享的util。 在这个模块中,我想创建一些单例:
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);
但这似乎并不优雅,因为我必须通过我的注射器(在这种情况下,通过提供静态吸气剂)。
还有其他方法吗?感谢。
答案 0 :(得分:1)
传递Baz
对象的更优雅方式是注入它。
例如,
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签名中。
剩下的问题是你必须在应用程序的入口点创建Injector。
在独立应用程序中,通常在main方法中创建注入器。
public static void main(String[] args) {
Injector injector = Guice.createInjector(new UtilModule(), new BusinessModule());
BusinessService businessService = injector.getInstance(BusinessService.class);
...
}
在Web应用程序中,可能以不同的方式创建注入器。这取决于框架。
的Servlet
...