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.