Pull to refresh

Java 6. Использование ServiceLoader'а для построения модульного приложения

Reading time2 min
Views3.1K
Что то я в последнее время обленился. Раньше следил за всеми обновлениями в Java. В своё время Java 1.5 Tiger я просто «съел с потрохами», но, увы, всё уже подзабылось.

И как то совсем незаметно прошел для меня релиз Java 1.6 Mustang. Описывать все «плюшки» я в данной статье не буду, а расскажу только о ServiceLoader'е.

Самый простой пример использования ServiceLoader'а — это разработка модульного приложения. Если бы я не знал о существовании данного класса, то я бы скорее всего использовал какой нибудь RCP, например Eclipse RPC или же NetBeans RPC. Но довольно часто уже есть написанное приложение, к которому хочется прикрутить возможность использования плагинов. Причём хочется сделать это просто, изяшно, без «лишней крови».

Модульный Hello World.


Постановка задачи

Итак, мы будем делать модульный «Hello World». В обязанности модуля входит предоставить строчку, которая с помощью главной программы и будет выведена в консоль.

API модуля

Создадим jar файл с API нашего модуля и положим в него один единственный файлик demo.HelloWorldInterface.java следующего содержания:
package demo;
public interface HelloWorldInterface {
  public String getMessage();
}


* This source code was highlighted with Source Code Highlighter.

Мы описали интерфейс, который будет использоваться в главной программе и который мы сейчас заимплементим нашим плагином.

Плагин

Создадим jar файл с имплементацией нашего API и положим в него сначала файлик demo.HelloWorldImpl.java следующего содержания:
package demo;
public class HelloWorldImpl implements HelloWorldInterface {
  public String getMessage() {
    return "Hello World";
  }
}


* This source code was highlighted with Source Code Highlighter.

А потом еще положим файлик demo.HelloWorldInterface в директорию META-INF/services в котором содержится всего одна строчка
demo.HelloWorldImpl

Главная программа

А теперь реализуем нашу главную программу. Код класса demo.Main, к котором содержится main метод выглядит примерно так
package demo;
import java.util.ServiceLoader;
public class Main {
  public static void main(String[] args) {
    for (HelloWorldInterface hw : ServiceLoader.load(HelloWorldInterface.class)) {
      System.out.println(hw.getMessage());
    }
  }
}


* This source code was highlighted with Source Code Highlighter.

Запуск

А теперь запустите Main класс с указанием в class path наших двух предварительно подготовленных jar'ок. Вуаля. Модульное приложение готово. Вся магия кроется в методе ServiceLoader.load(), при вызове которого происходит поиск во всех загруженных jar'ах в директории META-INF/services файлов с именем переданного интерфейса (в данном случае demo.HelloWorldInterface) и из них считываются имена классов, которые имплементят данный интрефейс. После этого создаются экземпляры этих классов и возвращаюься данным методом.

Источники
Tags:
Hubs:
Total votes 6: ↑6 and ↓0+6
Comments5

Articles