[英]Service Provider Interface in Java Enterprise
我想通過使用服務提供者接口對一個非常模塊化的工廠進行編碼,因此不必每次都修改工廠本身。
為此,我希望收到實現接口的所有具體類的列表,並在運行時通過每個方法的調用來決定使用哪個具體類,直到我擁有合適的Implementer。
示例:我有一個interface Poligon
和一個Class Triangle implements Poligon
的具體Class Triangle implements Poligon
。 判別方法為:
boolean isSuitableFor(int i) {
if (i == 3)
return true;
else
return false;
}
在Java SE中,我可以使用ServiceLoader做到這一點:在企業環境中,如何找到所有實現類,並且在運行時決定是否酌情使用其實現? 謝謝!
我可以考慮使用CDI解決此問題的幾種方法。
首先,如果isSuitableFor
方法與您列出的一樣簡單,則可以對列出的int使用帶有@Nonbinding
值的Qualifier
,並只需使用該限定符值查找實現。 假設限定符為@Vertices
並且Triangle
值為3
,那么限定符變為:
@Qualifier
@Target({ TYPE, METHOD, PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
public @interface Vertices {
@Nonbinding int value();
}
三角形變成:
@Vertices(3)
public class Triangle implements Polygon{
}
您將通過以下方式獲得對它的引用:
@Inject
@Vertices(3)
private Polygon polygon;
或者,您可以為頂點創建AnnotationLiteral
並通過實例手動查找。
另一種方法是遍歷所有實例,如下所示:
@Inject
@Any
private Instance<Polygon> polygons;
for(Polygon p : polygons) {
if(p.isSuitableFor(x)) {
// do something.
}
}
假設所有多邊形都是注冊的bean。 對於大量的多邊形,這將很慢。
第三種方法是使用事件,而不是限定類,而是限定觀察者方法。 例如
@Inject
private Event<SomePayload> somePayload;
// later on
somePayload.select(new VerticesLiteral(3)).fire(somePayload);
// and the observer method in Triangle
public void handle(@Observes @Vertices(3) SomePayload somePayload) { ... }
// and in square
public void handle(@Observes @Vertices(4) SomePayload somePayload) { ... }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.