- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 Google Guice。你知道如何实现“机器人腿”问题吗?让我用一个例子来解释这一点。
假设我有一些名为 Service
的类:
@Singleton
public class Service {
@Inject
Source source;
}
接口(interface)Source
有两个实现:
public class SourceDatabase implements Source {
}
public class SourceFileSystem implements Source {
}
我的模块是这样实现的:
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(Service.class).asEagerSingleton();
}
}
好吧,我想知道这是否可能:
public class MainClass {
@Inject @SomeAnnotation("database")
Service serviceWithADatabaseSource;
@Inject @SomeAnnotation("file-system")
Service serviceWithAFileSystemSource;
}
是否存在一些注释或绑定(bind)让我这样做,让我注释一个成员,如 serviceWithADatabaseSource
,这有助于 Guice 知道内部成员 source
应该是注入(inject) SourceDatabase
实现?
编辑:感谢 Daniel Martin,他在评论中为我们提供了此类问题的名称。
最佳答案
作为documented in the Guice Wiki , 你需要安装两个 PrivateModule s,每个都为您公开带有正确注释的服务。
public class MyModule extends AbstractModule {
@Override
protected void configure() {
install(new PrivateModule() {
@Override public void configure() {
// Bind Source to SourceDatabase.
bind(Source.class).to(SourceDatabase.class);
// Bind @Named("database") Service to Service.
bind(Service.class).annotatedWith(Names.named("database"))
.to(Service.class);
// Now expose @Named("database") Service without exposing
// either of the other two conflicting bindings.
expose(Service.class).annotatedWith(Names.named("database"));
}
});
install(new PrivateModule() {
@Override public void configure() {
// Same as above.
bind(Source.class).to(SourceFileSystem.class);
bind(Service.class).annotatedWith(Names.named("file-system"))
.to(Service.class);
expose(Service.class).annotatedWith(Names.named("file-system"));
}
});
}
}
如果模块不是 PrivateModule 实例,那么那些与 Source 和 Service 的绑定(bind)将相互冲突。然而,相反,每个绑定(bind)都从 Injector 继承了所有公共(public)绑定(bind),但只将 @Named(...) Service
暴露给外界。这样,相同的 Service
实现可以注入(inject)相同的未注释的 Source
但让它返回不同的完全注入(inject)类型。
另请注意,您将无法在 PrivateModules 之外请求 Source
或 Service
(没有注释),因为您尚未建立绑定(bind)在任何非私有(private)模块中。这应该是预期的:PrivateModule 绑定(bind)不应与任何公共(public)绑定(bind)冲突,并且如果不通过 PrivateModule 公开的绑定(bind)之一进入,Guice 将不知道哪个 Source
或 Service
返回。
最后,鉴于 Module 实例可以采用构造函数参数,将两个匿名内部 PrivateModule 提取到一个命名等效项中可能是个好主意:
public class MyModule extends AbstractModule {
@Override
protected void configure() {
install(new SourcePrivateModule(SourceDatabase.class, "database"));
install(new SourcePrivateModule(SourceFileSystem.class, "file-system"));
}
}
关于java - 如何使用 Google Guice 实现 "robot legs"用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35784112/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!