несколько пакетов в контексте: компонентное сканирование, весенний конфиг


185

Как добавить несколько context:component-scanэлементов в файл spring-servlet.xml в элемент?

я пытался

<context:component-scan base-package="z.y.z.service" base-package="x.y.z.controller" />

и

<context:component-scan base-package="x.y.z.service, x.y.z.controller" />

и

<context:component-scan base-package="x.y.z.service" />
<context:component-scan base-package="x.y.z.controller" />

но получил ошибку:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [x.y.z.dao.daoservice.LoginDAO] found for dependency:

Ответы:


272

Следующий подход является правильным:

<context:component-scan base-package="x.y.z.service, x.y.z.controller" /> 

Обратите внимание, что на ошибку выдается жалоба x.y.z.dao.daoservice.LoginDAO, которой нет в вышеупомянутых пакетах, возможно, вы забыли добавить ее:

<context:component-scan base-package="x.y.z.service, x.y.z.controller, x.y.z.dao" /> 

5
Этот ответ подразумевает, что нет рекурсии для членов базового пакета, НО есть: stackoverflow.com/questions/7774295/… . Я бы предложил немного изменить ответ, чтобы прояснить это.
Джангофан

52

Аннотационный подход

@ComponentScan({ "x.y.z", "x.y.z.dao" })

Нужно ли нам обязательно добавлять конкретные пакеты, или он может сканировать подпакеты автоматически, если мы определяем только пакет верхнего уровня?
Нихил Саху

@NikhilSahu Нет, это рекурсивное сканирование (весна 3>)
biology.info

ТАК ссылка для получения дополнительной информации: stackoverflow.com/questions/10794587/…
dkb

43

Вы можете добавить несколько базовых пакетов (см . Ответ axtavt ), но вы также можете отфильтровать то, что сканируется внутри базового пакета:

<context:component-scan base-package="x.y.z">
   <context:include-filter type="regex" expression="(service|controller)\..*"/>
</context:component-scan>

2
@ Shams нет необходимости, сэр, но если ответ правильный, вы должны пометить его как принятый (нажмите галочку)
Шон Патрик Флойд

1
Почему вы не можете добавить несколько базовых пакетов? Как например "org.example, com.example"?
Шервин Аскари


19
<context:component-scan base-package="x.y.z"/>

будет работать, так как остальные пакеты являются подпакетами "xyz". Таким образом, вам не нужно упоминать каждый пакет в отдельности.


2
Хорошо! Может быть, это была другая причина, но у меня это просто не сработало с весенним mvc для портлетов ...
elcadro

@elcadro, должно быть, были по другим причинам, так как это хорошо документировано и рекламируется
eis

Ну, я не могу сказать обратное, так как многие меня поправляют. Хотел бы я узнать, почему это не сработало для меня ... В любом случае, спасибо!
elcadro

Это верно даже для конфигурации на основе аннотаций?
Нихил Саху

6

Другой общий подход к аннотации:

@ComponentScan(basePackages = {"x.y.z"})

2

Если xyz является общим пакетом, то вы можете использовать:

<context:component-scan base-package="x.y.z.*">

он будет включать в себя весь пакет, который начинается с xyz, например: xyzcontroller, xyzservice и т. д.


1

Например, у вас есть пакет "com.abc", и у вас есть несколько пакетов внутри него, вы можете использовать как

@ComponentScan("com.abc")

0

Отложенный ответ, но для предоставления нескольких пакетов с использованием подхода, основанного на аннотациях, мы можем использовать, как показано ниже:

@ComponentScan({"com.my.package.one","com.my.package.subpackage.two","com.your.package.supersubpackage.two"})

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.