[Перевод] Java Service Loader в отличие от Spring Factory Loader

Java задняя часть Программа перевода самородков
[Перевод] Java Service Loader в отличие от Spring Factory Loader

И Java, и Spring предоставляют способ реализации IoC на уровне модуля (Примечание переводчика: инверсия управления). Функции, реализованные в них, очень похожи, но функции, предоставляемые Spring, более гибкие.

IOC не ограничивается решением проблемы сцепления зависимостей между классами в модуле, но также относится к модулям и модулям. Осги работал над этим. Но на самом деле как Java, так и весна обеспечивают поддержку IOC.

Java Service Loader

Сама Java предоставляет простой способ поддержки IoC с помощью [Service Loader] (https://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html), который может получить класс реализации указанный интерфейс в пути к классам проекта. Это позволяет нам знать, какие классы реализации доступны в пути к классам во время выполнения, тем самым отделяя определения интерфейса и зависимости между несколькими модулями реализации (пакетами JAR).

SLF4J как фреймворк ведения журналов использует этот подход. Сам SLF4J предоставляет только интерфейсы для работы с журналами, а другие системы журналов реализованы на основе этих интерфейсов (например, Logback и Log4J и т. д.). Пользователю нужно только записать журнал, вызвав интерфейс SLF4J, и конкретная реализация будет передана классу реализации, доступному в пути к классам проекта, для выполнения.

Чтобы использовать сервисный загрузчик, сначала необходимо установить каталог «Meta-Inf / Service» ниже пути класса, где расположен класс, а затем создать файл в этом каталоге на основе имени интерфейса. Имя файла файла должно быть полностью квалифицированным именем интерфейса, а его контент представляет собой список доступных ограниченных имен. Например, дляch.frankel.blog.serviceloader.FooДля этого интерфейса имя файла должно бытьMETA-INF/services/ch.frankel.blog.serviceloader.Foo, содержимое файла может быть следующим:

ch.frankel.blog.serviceloader.FooImpl1
ch.frankel.blog.serviceloader.FooImpl2

Содержащиеся в нем классы должны реализовыватьch.frankel.blog.serviceloader.Fooинтерфейс.

Код для получения класса реализации с помощью Service Loader очень прост:

ServiceLoader<Foo> loader = ServiceLoader.load(Foo.class);
loader.iterator();

Реализация Service Loader Spring

Основная библиотека Spring интегрирует Java Service Loader в фабричную модель. Например, в следующем коде предполагается, что в проекте есть хотя бы один необязательный интерфейс foo:

@Configuration
public class ServiceConfiguration {
    @Bean
    public ServiceListFactoryBean serviceListFactoryBean() {
        ServiceListFactoryBean serviceListFactoryBean = new ServiceListFactoryBean();
        serviceListFactoryBean.setServiceType(Foo.class);
        return serviceListFactoryBean;
    }
}
Object object = serviceListFactoryBean.getObject();

Очевидно, что от возврата вызова требуются дальнейшие операции для получения данных в правильном формате (примечание: serviceListFactoryBean — это связанный список).

Spring Factories Loader

Помимо интеграции загрузчика служб Java, Spring также предоставляет другую реализацию IoC. Нужно только добавить простой файл конфигурации, имя файла должно бытьspring.factoriesи положиMETA-INFВниз. С точки зрения кода этот файл передается через статический методSpringFactoriesLoader.loadFactories()читать. Эта реализация Spring вас действительно удивит. Код вызова не может быть проще:

List<Foo> foos = SpringFactoriesLoader.loadFactories(Foo.class, null);

Второй необязательный параметр выше — это загрузчик классов.

По сравнению с Java Service Loader есть два основных отличия:

  1. Является ли настройка через файл лучше, читабельнее и проще в сопровождении, чем другой способ, зависит от личных предпочтений.
  2. spring.factoriesНет требования, чтобы ключ был интерфейсом и реализовывал его значение. Например, Spring Boot использует этот метод для инициализации экземпляров класса: ключевым содержимым в конфигурации является аннотация, такая какorg.springframework.boot.autoconfigure.EnableAutoConfiguration, а значение может быть меткой@ConfigurationАннотированный класс. При гибком использовании можно выполнять все более и более сложные конструкции.

Ресурсы для этой статьи можно найти по адресуGitHubнаходится в формате Maven.

Дальнейшее чтение:

Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.