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