múltiples paquetes en contexto: escaneo de componentes, configuración de primavera


185

¿Cómo puedo agregar varios paquetes en el archivo spring-servlet.xml en context:component-scanelement?

Yo he tratado

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

y

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

y

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

pero tengo error:

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

Respuestas:


272

El siguiente enfoque es correcto:

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

Tenga en cuenta que el error se queja x.y.z.dao.daoservice.LoginDAO, que no está en los paquetes mencionados anteriormente, tal vez olvidó agregarlo:

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

55
Esta respuesta implica que NO hay recursividad para los miembros del paquete base, PERO HAY: stackoverflow.com/questions/7774295/… . Sugeriría alterar un poco la respuesta para aclarar esto.
djangofan


43

Puede agregar múltiples paquetes base (vea la respuesta de axtavt ), pero también puede filtrar lo que se escanea dentro del paquete base:

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

2
@shams no es necesario que me llame, pero si la respuesta es correcta, debe marcarla como aceptada (haga clic en la marca de verificación)
Sean Patrick Floyd

1
¿Por qué no puedes agregar múltiples paquetes base? ¿Como por ejemplo "org.example, com.example"?
Shervin Asgari

@ Shervin puedes. exactamente como lo escribiste. "Alternativamente, puede especificar una lista separada por comas que incluya el paquete principal de cada clase". (también vea la respuesta esperada)
Sean Patrick Floyd

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

funcionará ya que el resto de los paquetes son subpaquetes de "xyz". Por lo tanto, no necesita mencionar cada paquete individualmente.


2
¡Okay! Tal vez fue otra razón, pero esto simplemente no funcionó para mí con mvc de primavera para portlets ...
elcadro

@elcadro debe de haber pasado por otras razones, ya que esto está bien documentado y característica anunciada
EIS

Bueno, no puedo decir lo contrario, ya que muchas personas me están corrigiendo. Ojalá pudiera encontrar por qué esto no funcionó para mí ... ¡Gracias de todos modos!
elcadro

¿Es cierto incluso para la configuración basada en anotaciones?
Nikhil Sahu

6

Otro enfoque de anotación general:

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

2

Si xyz es el paquete común, puede usar:

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

incluirá todo el paquete que se inicia con xyz como: xyzcontroller, xyzservice, etc.


1

Por ejemplo, tiene el paquete "com.abc" y tiene varios paquetes dentro, puede usar como

@ComponentScan("com.abc")

0

Una respuesta retrasada, pero para dar múltiples paquetes usando un enfoque basado en anotaciones, podemos usar lo siguiente:

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.