Автозагрузка Spring с зависимостью и без @ComponentScan
Весенняя загрузка обеспечивает @ComponentScan
найти пакеты для сканирования.
Я строю библиотеку, которая имеет@RestControllers
внутри сpackage com.mylib.controller
, Есть и другие классы с аннотациями стереотипов в разных пакетах.
Итак, если кто-то разрабатывает приложение SpringBoot сcom.myapp
Базовый пакет. Он использует мою библиотеку в своем приложении. Он должен упомянуть@ComponentScan("com.mylib")
выявить стереотипные составляющие библиотеки.
Есть ли способ сканировать компоненты без включения пакета библиотеки в@ComponentScan
?
Поскольку исполнительный механизм пружинного башмака запускает свои конечные точки просто с зависимостью, не определяя @ComponentScan
, ИЛИ любой пакет по умолчанию, который сканируется независимо от базового пакета приложения.
2 ответа
Вы можете создать Spring Boot Starter в том же стиле, что и Spring Provided Starters. По сути, это библиотека jar'd с spring.factories
файл, указывающий на @Configuration
класс для загрузки с некоторыми другими аннотациями для обеспечения отмены переопределения / bean-компонента (@ConditionalOnMissingBean
) и вообще предоставлю свои @ConfigurationProperties
,
Стефан Николл предоставил отличную демонстрацию того, как его создать.
https://github.com/snicoll-demos/hello-service-auto-configuration
Это также задокументировано в документации по Spring Boot. https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html
Библиотечный подход также будет работать, но я не вижу никакой выгоды в том, чтобы не начинать с него. Дополнительно для любой библиотеки / стартера я бы порекомендовал сбросить @ComponentScan
и просто определяя бобы в @Configuration
, Это будет работать для таких стереотипов, как @RestController
и т.д. будет функционировать как обычно, если вы создадите @Bean
из этого в конфигурации.
Spring boot starter - это специальные артефакты, разработанные Spring и используемые Spring.
Вы можете проверить это в исходном коде, который содержит в основномspring.provides
файл:
обеспечивает: пружинный привод, микрометрический сердечник
Я не знаю точный способ обработки таким же образом, как Spring Boot Starter, но в качестве приемлемого обходного пути вы можете определить в своем банке @Configuration
класс, который определяет @ComponentScan("com.mylib")
,
@Configuration
@ComponentScan("com.mylib")
public class MyLibConfig {
//...
}
Таким образом, клиенты банка должны "только" импортировать @Configuration
учебный класс:
@Import(MyLibConfig.class)
@Configuration
public class ClientConfig{
//...
}