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

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

спасибо

5 65

5 ответов:

@ComponentScan использует массив строк, например:

@ComponentScan({"com.my.package.first","com.my.package.second"})

когда вы предоставляете несколько имен пакетов только в одной строке, Spring интерпретирует это как одно имя пакета и, следовательно, не может его найти.

есть еще type-safeальтернатива для указания расположения базового пакета в виде строки. смотрите API здесь, но я также показано ниже:

@ComponentScan(basePackageClasses = {ExampleController.class, ExampleModel.class, ExmapleView.class})

С помощью basePackageClasses спецификатор с вашими ссылками на класс скажет Spring сканировать эти пакеты (так же, как упомянутый варианты), но этот метод является как type-safe и добавляет:поддержка IDE для будущий рефакторинг -- огромный плюс в моей книге.

читая из API, Spring предлагает создать класс маркеров no-op или интерфейс в каждом пакете, который вы хотите сканировать, который не служит никакой другой цели, кроме использования в качестве ссылки для/этим атрибутом.

ИМО, мне не нравится маркер-классы (но опять же, они в значительной степени похожи на классы package-info) но безопасность типов, поддержка IDE и резкое сокращение количества базовых пакетов, необходимых включить для этого сканирования, без сомнения, гораздо лучший вариант.

Укажите имя пакета отдельно, для этого требуется String[] для имен пакетов.

вместо этого:

@ComponentScan("com.my.package.first,com.my.package.second")

используйте этот:

@ComponentScan({"com.my.package.first","com.my.package.second"})

другой способ сделать это с помощью basePackages поле; которое является полем внутри аннотации ComponentScan.

@ComponentScan(basePackages={"com.firstpackage","com.secondpackage"})

Если вы посмотрите в аннотации ComponentScan .класс из файла jar вы увидите поле basePackages, которое принимает массив строк

public @interface ComponentScan {
String[] basePackages() default {};
}

вы используете ComponentScan для сканирования нескольких пакетов с помощью

@ComponentScan({"com.my.package.first","com.my.package.second"})