Что такое ServiceLoader и как он используется? - PullRequest
0 голосов
/ 06 сентября 2018

Я натолкнулся на документацию ServiceLoader и неясно, для каких вариантов использования он подходит.

Когда можно использовать ServiceLoader?

Ответы [ 4 ]

0 голосов
/ 06 сентября 2018

Вы используете ServiceLoader, когда хотите, чтобы ваша программа имела функцию «плагина». Если вы хотите, чтобы люди могли настраивать ваше приложение, добавляя jar-файлы в classpath, которые содержат реализации определенного подмножества функций, вы можете использовать ServiceLoader для поиска этих реализаций в classpath.

ServiceLoader сам по себе является реализацией спецификации jar SPI , которая существует уже давно. (Я считаю, что это было введено в Java 1.3.)

Java SE уже использует его именно для этой цели во многих местах, включая:

0 голосов
/ 06 сентября 2018

Вы знакомы с принципом "Инверсия управления" ?

Java реализовала это ServiceLoader. Класс предназначен для размещения классов реализации интерфейса на пути к классам. Вы передаете интерфейс службы, вы получаете реализацию (ы) этой службы.

Вы можете найти хороший практический пример здесь .


P.S .: Несмотря на то, что это готовое решение и довольно простой инструмент, я думаю, что оно устарело и недостаточно гибко по сравнению с контейнером Spring IoC и Google Guice.

0 голосов
/ 06 сентября 2018

ServiceLoader - это легковесная альтернатива Java полноразмерному контейнеру IoC, такому как Spring, Guice и т. Д. В нем гораздо меньше наворотов, чем в этих средах, но он хорошо работает для базовых случаев использования, когда вам просто нужно найти то, чтоклассы реализуют интерфейс.

Большинство серверов приложений будут иметь некоторые варианты использования ServiceLoader, которые вы можете увидеть на практике:

https://github.com/apache/tomee/search?q=ServiceLoader&unscoped_q=ServiceLoader

https://github.com/apache/tomcat/search?q=ServiceLoader&unscoped_q=ServiceLoader

https://github.com/wildfly/wildfly/search?q=ServiceLoader&unscoped_q=ServiceLoader

0 голосов
/ 06 сентября 2018

Когда я слышу что-то о ServiceLoader, первое, что приходит мне в голову, это JDBC. Эта технология обеспечивает загрузку классов драйвера JDBC из пути к классам без использования Class.forName(Class<?>clazz).

Кроме того, я уверен, что есть много примеров использования ServiceLoader, кроме JDBC

...