Интерфейс поставщика услуг (SPI), работающий в Java - PullRequest
1 голос
/ 08 июля 2020

Как работают интерфейсы поставщика услуг в Java. Я работал с JDB C и обнаружил, что SPI заботится о загрузке класса Driver.

В следующей строке представлены классы реализации для Driver, которые мы можем выполнять с помощью iterator ().

ServiceLoader.load(Driver.class); // returns the ServiceLoader for Driver class, we can iterate to get all implementation classes

Я хотел знать, как этот метод работает внутри Java.

1 Ответ

1 голос
/ 08 июля 2020

Там довольно много документации , поставляемой с классом. Вы ищете дополнительную информацию?

Услуги в Java определяются файлом конфигурации поставщика услуг, включенным в jar-файл службы. Имя этого файла основано на имени интерфейса службы и имеет вид META-INF/services/com.example.CodecFactory (для использования примера из документации ServiceLoader) или META-INF/services/java.sql.Driver (для примера JDB C, который, я думаю, вы using).

Здесь важно понять, что все файлы конфигурации поставщика услуг для конкретной службы имеют одинаковое имя. Это означает, что путь к классам содержит несколько ресурсов с этим именем, по одному на каждого поставщика услуг. Метод ClassLoader.getResources (обратите внимание, что это getResources не getResource) возвращает Enumeration, который ServiceLoader может использовать для перебора всех файлов конфигурации и идентификации каждого поставщика.

Каждый файл конфигурации просто содержит имя класса реализации. Например, если вы посмотрите на банку Postgres, которая называется META-INF/services/java.sql.Driver, в ней будет всего одна строка: org.postgresql.Driver. ServiceLoader просто считывает имя класса реализации из файла, затем вызывает Class.forName с именем класса, а затем newInstance для создания экземпляра класса реализации, который затем может быть преобразован в java.sql.Driver или любой другой интерфейс службы. равно.

Если приложению требуется дополнительная информация о каждом поставщике услуг, оно обычно может получить эту информацию через интерфейс службы. Например, интерфейс java.sql.Driver включает такие методы, как acceptsURL, getMinorVersion / getMajorVersion, et c. которое приложение может использовать для получения информации о драйверах JDB C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...