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

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:
Shams
источник

Ответы:

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" /> 
axtavt
источник
5
Этот ответ подразумевает, что нет рекурсии для членов базового пакета, НО есть: stackoverflow.com/questions/7774295/… . Я бы предложил немного изменить ответ, чтобы прояснить это.
Джангофан
52

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

@ComponentScan({ "x.y.z", "x.y.z.dao" })
biology.info
источник
Нужно ли нам обязательно добавлять конкретные пакеты, или он может сканировать подпакеты автоматически, если мы определяем только пакет верхнего уровня?
Нихил Саху
@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"})
Robocide
источник
2

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

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

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

Амит Шарма
источник
1

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

@ComponentScan("com.abc")
sForSujit
источник
0

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

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

Сантош К Тадка
источник