2016-03-23 3 views
0

Как настроить инъекцию зависимостей в проекте библиотеки?

Позвольте мне проиллюстрировать этот вопрос следующим примером.Как настроить инъекцию зависимостей в проект библиотеки?

Maven проекта Библиотека

ReservationAPI

com.example.reservation-апи

Этот проект содержит удобный класс под названием ReservationApiClient который использует RestTemplate (от Spring Framework) для выполнение HTTP-вызовов.

Возможно ли сделать поле RestTemplate @Autowired в этом проекте библиотеки, а не создавать его самостоятельно?

Maven Исполняемого Проект

org.company.application

Этот проект является Загрузочным приложением Spring и использует выше ReservationAPI как зависимость. Это приложение создаст @Bean для класса удобства ReservationApiClient, содержащегося в этой библиотеке, и затем выполнит его общедоступные методы, которые, в свою очередь, сделают HTTP-запросы.

Что такое хорошая стратегия и/или лучшие практики для описанного выше сценария?

ответ

0

Вы можете сделать это, если вы включили автоувеличивание в проект библиотеки, хотя это означает, что его всегда нужно использовать с контекстом приложения Spring, чтобы получить значение, если вы также не используете методы getter/setter. Тем не менее, я не думаю, что использование RestTemplate в качестве объекта с автоопределением имеет смысл, поскольку в RestTemplate нет ничего конкретного, и если вы не назовете bean-компоненты, для класса будет только одно определение bean-компонента. Все методы для RestTemplate в любом случае требуют URI. Поэтому в этом случае я просто использую компонент для вашего ReservationApiClient в вашем приложении.

Другой способ сделать это, если вы хотите включить зависимости Spring в своей библиотеке (что, я думаю, вы уже используете RestTemplate), вы можете объявить свой ReservationApiClient как @Service или @Component, а затем использовать аннотацию @ComponentScan в вашем основном проекте Spring Boot для поиска этой библиотеки для компонентов, которые будут включены в реестр компонентов.

Другой вариант - использовать функцию Autoconfigure Spring Boot для создания заводов, использующих сторонние библиотеки, и их настройки для каждого свойства в настройках вашего приложения. auto configuration documentation было бы хорошим местом для начала. Вы можете видеть стартовые проекты, которые у них есть on GitHub, а затем связанные с ними Autoconfigure classes, с которыми они связаны.

Сообщите мне, если это не имеет смысла.

+0

Я выбрал простой пример, чтобы упростить чтение, но у RestTemplate есть прецедент для инъекций. Задание свойств на RestTemplate, таких как TimeOut и т. Д., А затем совместное использование одного и того же объекта во всей библиотеке в качестве одноэлементного метода - это то, почему мне нравится использовать Spring Framework. Но я предполагаю, что вы правы, что для этого потребуется контекст приложения, который не подходит для проекта исполняемой библиотеки. –

+0

Ваше второе предложение, использующее проверку компонентов, может работать в этом простом примере, но что, если проект был с открытым исходным кодом? Это потребует от исполняющего приложения использовать Spring Framework, что является большим ограничением для пользователя библиотеки. –

+0

Правильно, если вы используете библиотеку, которая не включает Spring framework, вы захотите объявить beans в структуре приложения, если они просты. В противном случае вы, вероятно, захотите создать фабрики, поскольку фабрики должны иметь возможность выполнять другую конфигурацию. Я думаю, что эта функция Spring Boot для автоконфигурации http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html будет тем, что вы хотите настроить вещи так, как вы хотите, используя свойства из основного приложения. –

Смежные вопросы