在Guice中“从一个提供者”继承“注释”

时间:2012-12-26 10:15:15

标签: java guice

说我有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?

由于 亚龙

2 个答案:

答案 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)元组的精美地图对于提供者,你要求推断在依赖图中一直存在或不存在的元组。