说我有2节课。
class A { ... }
class B {
public B(A a) {...}
}
我想创建一个获取名称并需要为带注释的B创建绑定的模块:
class MyModule extends AbstractModule {
String name;
public MyModule(String name) { this.name = name; }
public void configure() {
// CREATE BINDING for @Named(name)B which depends on @Named(name)A
}
}
为B(或其提供者)创建绑定的最佳方法是什么,这取决于正确的A?
由于 亚龙
答案 0 :(得分:0)
这个怎么样:
bind(B.class).annotatedWith(Names.named("name")).toProvider( new Provider<B>() {
private A namedA;
@Inject
public void setNamedA(@Named("name") A namedA ) {
this.namedA = namedA;
}
@Override
public B get() {
return new B( namedA );
}
} );
它应该根据文档工作,虽然我还没有测试过。
答案 1 :(得分:0)
我本周在different SO thread回答了一个非常相似的问题。
如果您知道要支持哪些注释,则可以为每个注释创建PrivateModule
,这样您就可以公开@Named("c1") B
以仅在{A}}处使用@Named("c1") A
需要受到约束。
install(new PrivateModule() {
@Override void configure() {
// These are only bound within this module, and are not visible outside.
bind(A.class).to(A1.class);
// Though you can bind to other bindings which come from outside!
bind(B.class).to(Key.get(B.class, Names.named("c1")));
// Now expose the annotated bindings you'd like to expose.
bind(C.class).annotatedWith(Names.named("c1")).to(C.class);
expose(C.class).annotatedWith(Names.named("c1"));
}
});
我认为没有办法说“对于所有注释N,使@N B
可用@N A
,因为Guice被构建为来自(Annotation,TypeLiteral)元组的精美地图对于提供者,你要求推断在依赖图中一直存在或不存在的元组。