[英]“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.