Статьи

Java 9: ​​ServiceLoader

Класс 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, являются их собственными.