декілька пакетів у контексті: компонентне сканування, конфігурація весни


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/… . Я б запропонував трохи змінити відповідь, щоб зробити це зрозумілим.
djangofan

52

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

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

Чи потрібно в обов’язковому порядку додавати конкретні пакети, або він може сканувати підпакети автоматично, якщо ми визначаємо лише пакет верхнього рівня?
Нікхіл Саху

@NikhilSahu nope, це рекурсивне сканування (Весна 3>)
biology.info

SO посилання для отримання додаткової інформації: stackoverflow.com/questions/10794587 / ...
ДКБ

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

Чи справедливо це навіть для конфігурації на основі анотацій?
Нікхіл Саху


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.