Класс java.util.ServiceLoader загружает поставщиков / реализации сервисов во время выполнения. Во время компиляции ServiceLoader просто необходимо знать интерфейс сервиса. Благодаря модульности Java9 мы можем динамически добавлять модули реализации сервисов во время выполнения, а приложение может иметь новую реализацию, не оказывая никакого влияния,
Давайте проверим на примере создание модуля EventsAPI с интерфейсом EventService.java.
EventsAPI / EventService.java
|
1
2
3
4
5
|
package events.api;public interface EventService { public String getName();} |
EventsAPI / module-info.java
|
1
2
3
|
module events.api { exports events.api;} |
Создайте реализацию интерфейса EventService в другом модуле под названием FacebookEvents
FacebookEvents / FacebookEventService.java
|
01
02
03
04
05
06
07
08
09
10
11
12
|
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
|
1
2
3
4
5
6
|
module events.api.facebook { requires events.api; provides events.api.EventService with events.api.facebook.FacebookEventService;} |
Модуль FacebookEvents требует EventsAPI, потому что он должен иметь доступ к интерфейсу EventService.java.
И это обеспечивает реализацию EventService с FacebookEventService.
Давайте создадим клиентский модуль EventsClient для использования EventsAPI
EventsClient / module-info.java
|
1
2
3
4
|
module client.calendar {requires events.api;uses events.api.EventService;} |
Мы собираемся использовать ServiceLoader для поиска реализаций интерфейса EventService, здесь ServiceLoader требует использования ключевого слова на EventService, в противном случае компилятор выдаст ошибку.
Наконец-то класс Client Test
EventsClient / Calendar.java
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
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 мы ничего не упоминаем о модуле FacebookEvents, при запуске вышеупомянутого модуля Calendar.java добавить FacebookEvents, результат будет
выход
|
1
2
3
4
5
|
Calendar events..!!!FacebookEventService Constructor1627960023 : facebook eventsFacebookEventService Constructor745160567 : facebook events |
ServiceLoader обнаружил реализацию EventEervice FacebookEventService и показал вывод, позволяет добавить еще одну реализацию в интерфейс EventService и проверить вывод вышеуказанного клиента.
TwitterEvents / module-info.java
|
1
2
3
4
5
|
module events.api.twitter {requires events.api;provides events.api.EventServicewith events.api.twitter.TwitterEventService;} |
так же, как FacebookEventService, будет иметь TwitterEventService, который будет реализовывать интерфейс EventService
TwitterEvents / TwitterEventService.java
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
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";}} |
Запустите EventsClient / Calendar.java , добавив модуль TwitterEvents в путь модуля, и выведите его следующим образом
Календарь событий .. !!!
|
1
2
3
4
5
6
7
8
|
TwitterEventService Constructor249515771 : twitter eventsFacebookEventService Constructor1627960023 : facebook eventsTwitterEventService Constructor321142942 : twitter eventsFacebookEventService Constructor745160567 : facebook events |
Мы только что добавили модуль TwitterEvents во время выполнения, ServiceLoader может загрузить TwitterEventService и выдать желаемый результат.
Исходный код доступен по адресу https://github.com/rameshcharykotha/java9practice
Спасибо за чтение..!!
| Опубликовано на Java Code Geeks с разрешения Рамеша Кота, партнера нашей программы JCG. Смотреть оригинальную статью здесь: Java9: ServiceLoader
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |