我想在不引入注释或使用字符串键名称的情况下完成以下操作,是否可以使用Guice
?此外,为MyService
及其ExecutorService
绑定引入第三个私有模块并不理想,因为我希望ExecutorService是整个应用程序的单例,不仅注入MyService
,还注入其他类,例如MyOtherService
。Guice子模块阻止继承绑定
public class Main {
public static void main(String[] args) {
final Injector injector = Guice.createInjector(new MyAppModule());
final MyService service = injector.getInstance(MyService.class);
service.printInternals();
// Ideally this would print something like:
// My Executor: [email protected]
// Red Executor: [email protected]
// Blue Executor: [email protected]
}
}
public class MyAppModule extends PrivateModule {
@Override
protected void configure() {
install(new RedModule());
install(new BlueModule());
bind(ExecutorService.class).toInstance(Executors.newSingleThreadExecutor());
bind(MyService.class).to(MyServiceImpl.class);
expose(MyService.class);
}
}
public class BlueModule extends PrivateModule {
@Override
protected void configure() {
bind(ExecutorService.class).toInstance(Executors.newSingleThreadExecutor());
bind(BlueService.class).to(BlueServiceImpl.class);
expose(BlueService.class);
}
}
public interface BlueService {
void printInternals();
}
class BlueServiceImpl implements BlueService {
private final ExecutorService executor;
@Inject
BlueServiceImpl(final ExecutorService executor) {
this.executor = executor;
}
@Override
public void printInternals() {
System.out.println("Blue Executor: " + executor);
}
}
RedModule, RedService and RedServiceImpl
所有镜像它们各自Blue*
类。
最后MyService
,它使用Red
和Blue Services
以及它自己的ExecutorService
:
class MyServiceImpl implements MyService {
private final ExecutorService executor;
private final RedService red;
private final BlueService blue;
@Inject
MyServiceImpl(final ExecutorService executor, final RedService red, final BlueService blue) {
this.executor = executor;
this.red = red;
this.blue = blue;
}
@Override
public void printInternals() {
System.out.println("My Executor: " + executor);
red.printInternals();
blue.printInternals();
}
}
请注意,使用注入器而不是模块将会阻止您重写它们。 https://github.com/google/guice/issues/347 – Alex 2015-05-22 11:12:12