Класс 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 Constructor 1627960023 : facebook events FacebookEventService Constructor 745160567 : 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.EventService with 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 Constructor 249515771 : twitter events FacebookEventService Constructor 1627960023 : facebook events TwitterEventService Constructor 321142942 : twitter events FacebookEventService Constructor 745160567 : facebook events |
Мы только что добавили модуль TwitterEvents во время выполнения, ServiceLoader может загрузить TwitterEventService и выдать желаемый результат.
Исходный код доступен по адресу https://github.com/rameshcharykotha/java9practice
Спасибо за чтение..!!
Опубликовано на Java Code Geeks с разрешения Рамеша Кота, партнера нашей программы JCG. Смотреть оригинальную статью здесь: Java9: ServiceLoader
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |