Я использую 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
аннотации.
Как правильно делать то, что мне нужно?
Благодарность
java
spring
annotations
Программист
источник
источник
Ответы:
@ComponentScan использует массив строк, например:
@ComponentScan({"com.my.package.first","com.my.package.second"})
Когда вы указываете несколько имен пакетов только в одной строке, Spring интерпретирует это как одно имя пакета и поэтому не может его найти.
источник
Существует еще одна безопасная для типов альтернатива указанию местоположения базового пакета как String. См. API здесь , но я также проиллюстрировал ниже:
@ComponentScan(basePackageClasses = {ExampleController.class, ExampleModel.class, ExmapleView.class})
Использование спецификатора basePackageClasses с вашими ссылками на классы укажет Spring сканировать эти пакеты (как и упомянутые альтернативы ), но этот метод является типобезопасным и добавляет поддержку IDE для будущего рефакторинга - огромный плюс в моей книге.
При чтении из API Spring предлагает создать класс маркера без операции или интерфейс в каждом пакете, который вы хотите сканировать, который не служит никакой другой цели, кроме использования в качестве ссылки для этого атрибута.
ИМО, мне не нравятся классы-маркеры (но опять же, они во многом похожи на классы информации о пакете), но безопасность типов, поддержка 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 .class из файла jar, вы увидите поле basePackages, которое принимает массив строк
public @interface ComponentScan { String[] basePackages() default {}; }
Или вы можете явно указать классы. Которая принимает массив классов
источник
Вы используете ComponentScan для сканирования нескольких пакетов с помощью
@ComponentScan({"com.my.package.first","com.my.package.second"})
источник
убедитесь, что вы добавили эту зависимость в свой pom.xml
источник
Я использую:
@ComponentScan(basePackages = {"com.package1","com.package2","com.package3", "com.packagen"})
источник
Вы также можете использовать аннотацию @ComponentScans:
@ComponentScans(value = { @ComponentScan("com.my.package.first"), @ComponentScan("com.my.package.second") })
источник