Подтвердить что ты не робот

Как сканировать несколько путей с помощью аннотации @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.

Каков правильный способ делать то, что мне нужно?

Спасибо

4b9b3361

Ответ 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>