- Оригинальный адрес:Java Service Loader vs. Spring Factories Loader
- Оригинальный автор:Nicolas Frankel
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:HearFishle
- Корректор:Endone,ziyin feng
И 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 есть два основных отличия:
- Является ли настройка через файл лучше, читабельнее и проще в сопровождении, чем другой способ, зависит от личных предпочтений.
-
spring.factories
Нет требования, чтобы ключ был интерфейсом и реализовывал его значение. Например, Spring Boot использует этот метод для инициализации экземпляров класса: ключевым содержимым в конфигурации является аннотация, такая какorg.springframework.boot.autoconfigure.EnableAutoConfiguration
, а значение может быть меткой@Configuration
Аннотированный класс. При гибком использовании можно выполнять все более и более сложные конструкции.
Ресурсы для этой статьи можно найти по адресуGitHubнаходится в формате Maven.
Дальнейшее чтение:
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.