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:
Shams
fuente

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" /> 
axtavt
fuente
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
52

Enfoque de anotaciones

@ComponentScan({ "x.y.z", "x.y.z.dao" })
biology.info
fuente
¿Necesitamos obligatoriamente agregar paquetes específicos o puede escanear subpaquetes automáticamente si solo definimos el paquete de nivel superior?
Nikhil Sahu
@NikhilSahu no, es una exploración recursiva (Spring 3>)
biology.info
Enlace SO para obtener más información: stackoverflow.com/questions/10794587/…
dkb
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>
Sean Patrick Floyd
fuente
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.

Irene
fuente
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"})
Robocida
fuente
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.

Amit Sharma
fuente
1

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

@ComponentScan("com.abc")
sForSujit
fuente
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"})

Santhosh K Thadka
fuente