Как сканировать несколько путей с помощью аннотации @ComponentScan?
Я использую Spring 3.1 и загружаю приложение, используя атрибуты @Configuration
и @ComponentScan
.
Фактическое начало выполняется с помощью
new AnnotationConfigApplicationContext(MyRootConfigurationClass.class);
Этот класс конфигурации аннотируется с помощью
@Configuration
@ComponentScan("com.my.package")
public class MyRootConfigurationClass
и это отлично работает. Однако я хотел бы уточнить, какие пакеты я сканирую, поэтому я попробовал.
@Configuration
@ComponentScan("com.my.package.first,com.my.package.second")
public class MyRootConfigurationClass
Однако это не удается с ошибками, говорящими мне, что они не могут найти компоненты, указанные с помощью аннотации @Component
.
Каков правильный способ делать то, что мне нужно?
Спасибо
Ответы
Ответ 1
@ComponentScan использует строковый массив, например так:
@ComponentScan({"com.my.package.first","com.my.package.second"})
Когда вы предоставляете несколько имен пакетов только в одной строке, Spring интерпретирует это как одно имя пакета и, следовательно, не может его найти.
Ответ 2
Существует еще одна безопасная для типов альтернатива определению местоположения базового пакета как String. Посмотрите API здесь, но я также проиллюстрировал ниже:
@ComponentScan(basePackageClasses = {ExampleController.class, ExampleModel.class, ExmapleView.class})
Используя спецификатор basePackageClasses с вашими ссылками на классы, скажите Spring сканировать эти пакеты (так же, как упомянутые альтернативы), но этот метод является безопасным по типу и добавляет поддержку IDE для будущего рефакторинга - огромный плюс в моей книге.
Чтение из API, Spring предлагает создать класс или интерфейс маркера no-op в каждом пакете, который вы хотите сканировать, который не служит никакой другой цели, чем использовать в качестве ссылки для/с помощью этого атрибута.
IMO, мне не нравятся классы-маркеры (но опять же, они в значительной степени похожи на классы пакета-информации), но безопасность типа, поддержка IDE и значительное сокращение количества базовых пакетов, которые необходимо включить для этого сканирования, без сомнения, намного лучший вариант.
Ответ 3
Укажите название своего пакета отдельно, для имен пакетов требуется String[]
.
Вместо этого:
@ComponentScan("com.my.package.first,com.my.package.second")
Используйте это:
@ComponentScan({"com.my.package.first","com.my.package.second"})
Ответ 4
Другой способ сделать это - использовать поле basePackages
; который является полем внутри аннотации ComponentScan.
@ComponentScan(basePackages={"com.firstpackage","com.secondpackage"})
Если вы посмотрите в аннотации ComponentScan.class из файла jar, вы увидите поле basePackages, которое принимает массив строк
public @interface ComponentScan {
String[] basePackages() default {};
}
Ответ 5
Вы используете ComponentScan для сканирования нескольких пакетов с помощью
@ComponentScan({"com.my.package.first","com.my.package.second"})
Ответ 6
убедитесь, что вы добавили эту зависимость в ваш pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>