plusieurs packages en contexte: analyse des composants, configuration du printemps


185

Comment puis-je ajouter plusieurs packages dans le fichier spring-servlet.xml dans l' context:component-scanélément?

j'ai essayé

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

et

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

et

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

mais j'ai eu une erreur:

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

Réponses:


272

L'approche suivante est correcte:

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

Notez que l'erreur se plaint x.y.z.dao.daoservice.LoginDAO, qui n'est pas dans les packages mentionnés ci-dessus, peut-être avez-vous oublié de l'ajouter:

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

5
Cette réponse implique qu'il n'y a PAS de récursivité pour les membres de base-package MAIS il y a: stackoverflow.com/questions/7774295/… . Je suggérerais de modifier un peu la réponse pour que cela soit clair.
djangofan


43

Vous pouvez ajouter plusieurs packages de base (voir la réponse d'axtavt ), mais vous pouvez également filtrer ce qui est analysé à l'intérieur du package de base:

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

2
@shams pas besoin de monsieur moi, mais si la réponse est correcte, vous devez la marquer comme acceptée (cliquez sur la coche)
Sean Patrick Floyd

1
Pourquoi ne pouvez-vous pas ajouter plusieurs packages de base? Comme par exemple "org.example, com.example"?
Shervin Asgari

@Shervin vous pouvez. exactement comme vous l'avez écrit. "Vous pouvez également spécifier une liste séparée par des virgules qui inclut le package parent de chaque classe." (voir aussi la réponse attendue)
Sean Patrick Floyd

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

fonctionnera puisque le reste des packages sont des sous-packages de "xyz". Ainsi, vous n'avez pas besoin de mentionner chaque paquet individuellement.


2
D'accord! Peut-être que c'était une autre raison, mais cela ne fonctionnait tout simplement pas pour moi avec spring mvc pour les portlets ...
elcadro

@elcadro a dû traverser d'autres raisons, car cette fonctionnalité est bien documentée et annoncée
eis

Eh bien, je ne peux pas dire le contraire car beaucoup de gens me corrigent. J'aimerais pouvoir trouver pourquoi cela n'a pas fonctionné pour moi ... Merci quand même!
elcadro

Est-ce vrai même pour la configuration basée sur les annotations?
Nikhil Sahu

6

Une autre approche générale d'annotation:

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

2

Si xyz est le package commun, vous pouvez utiliser:

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

il inclura tous les paquets commençant par xyz comme: xyzcontroller, xyzservice etc.


1

Par exemple, vous avez le package "com.abc" et vous avez plusieurs packages à l'intérieur, vous pouvez utiliser comme

@ComponentScan("com.abc")

0

Une réponse retardée mais pour donner plusieurs packages en utilisant une approche basée sur les annotations, nous pouvons utiliser comme ci-dessous:

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.