簡體   English   中英

在Guice中從一個提供者“繼承”注釋到另一個提供者

[英]“Inheriting” annotations from one provider to another in 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)?

謝謝亞倫

這個怎么樣:

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 );
    }

} );

盡管我還沒有測試過,但它應該可以根據文檔工作。

我這周在另一個SO線程中回答了一個非常類似的問題。

如果知道要支持的批注,則可以為每個批注創建一個PrivateModule ,以便可以在需要@Named("c1") A任何地方公開@Named("c1") B以僅使用@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,請提供@NB以使用@NA ,因為Guice的構建是從(Annotation,TypeLiteral)元組到Providers的精美映射,而您要推斷在依賴圖下可能一直存在或不存在的元組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM