Автозагрузка 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{
  //...
}