Java 9:ServiceLoader
java.util.ServiceLoader類在運(yùn)行時(shí)加載服務(wù)提供者/實(shí)現(xiàn)。 在編譯時(shí),ServiceLoader只需要知道Service接口。 借助Java9模塊化,我們可以在運(yùn)行時(shí)動(dòng)態(tài)添加服務(wù)實(shí)現(xiàn)模塊,而Application可以擁有新的實(shí)現(xiàn),而不會(huì)影響任何事情,
讓我們以示例進(jìn)行檢查,并使用EventService.java接口創(chuàng)建模塊EventsAPI
EventsAPI / EventService.java
package events.api;public interface EventService {public String getName(); }EventsAPI /模塊信息.java
module events.api {exports events.api; }在另一個(gè)名為FacebookEvents的模塊中為EventService接口創(chuàng)建一個(gè)實(shí)現(xiàn)
FacebookEvents / FacebookEventService.java
package events.api.facebook; import events.api.EventService;public class FacebookEventService implements EventService{public FacebookEventService() {System.out.println("FacebookEventService Constructor");}public String getName() {return "facebook events";} }FacebookEvents / module-info.java
module events.api.facebook {requires events.api;provides events.api.EventServicewith events.api.facebook.FacebookEventService; }FacebookEvents模塊需要EventsAPI,因?yàn)樗枰袡?quán)訪問EventService.java接口。
并且它通過 FacebookEventService 提供 EventService實(shí)現(xiàn)。
讓我們創(chuàng)建一個(gè)客戶端模塊EventsClient以使用EventsAPI
EventsClient / module-info.java
module client.calendar { requires events.api; uses events.api.EventService; }我們將使用ServiceLoader查找EventService接口的實(shí)現(xiàn),此處ServiceLoader需要在EventService上使用uses關(guān)鍵字,否則編譯器將引發(fā)錯(cuò)誤。
最終客戶測(cè)試課程
EventsClient / Calendar.java
package client.calendar; import java.util.ServiceLoader; import events.api.EventService;public class Calendar { public static void main(String[] args) { System.out.println("Calendar events..!!!"); ServiceLoader<EventService> events = ServiceLoader.load(EventService.class);for(EventService event : events) { System.out.println(event.hashCode() + " : " +event.getName()); } events.reload(); for(EventService event : events) { System.out.println(event.hashCode() + " : " +event.getName()); } } }在EventsClient模塊中,我們沒有提及任何有關(guān)FacebookEvents模塊的信息,而在運(yùn)行上述Calendar.java add FacebookEvents模塊時(shí),輸出為
輸出
Calendar events..!!! FacebookEventService Constructor 1627960023 : facebook events FacebookEventService Constructor 745160567 : facebook eventsServiceLoader找到了EventService實(shí)現(xiàn)FacebookEventService并顯示了輸出,讓我們向EventService接口添加另一個(gè)實(shí)現(xiàn)并檢查上述客戶端的輸出
TwitterEvents / module-info.java
module events.api.twitter { requires events.api; provides events.api.EventService with events.api.twitter.TwitterEventService; }與FacebookEventService相同,將具有TwitterEventService,它將實(shí)現(xiàn)EventService接口
TwitterEvents / TwitterEventService.java
package events.api.twitter;import events.api.EventService;public class TwitterEventService implements EventService{public TwitterEventService() { System.out.println("TwitterEventService Constructor"); }public String getName() { return "twitter events"; } }通過在模塊路徑上添加TwitterEvents模塊來運(yùn)行EventsClient / Calendar.java ,輸出如下
日歷活動(dòng).. !!!
TwitterEventService Constructor 249515771 : twitter events FacebookEventService Constructor 1627960023 : facebook events TwitterEventService Constructor 321142942 : twitter events FacebookEventService Constructor 745160567 : facebook events我們剛剛在運(yùn)行時(shí)添加了TwitterEvents模塊,ServiceLoader能夠加載TwitterEventService并提供所需的輸出。
源代碼位于https://github.com/rameshcharykotha/java9practice
謝謝閱讀..!!
翻譯自: https://www.javacodegeeks.com/2017/10/java-9-serviceloader.html
總結(jié)
以上是生活随笔為你收集整理的Java 9:ServiceLoader的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 税局备案都需要什么(税局备案)
- 下一篇: 安卓不锁屏怎么设置(安卓 不锁屏)