簡體   English   中英

Java Enterprise中的服務提供者接口

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

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