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:
Shams
la source

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

Approche d'annotation

@ComponentScan({ "x.y.z", "x.y.z.dao" })
biology.info
la source
Avons-nous obligatoirement besoin d'ajouter des packages spécifiques ou il peut analyser automatiquement les sous-packages si nous ne définissons que le package de niveau supérieur?
Nikhil Sahu
@NikhilSahu non, c'est un scan récursif (printemps 3>)
biology.info
Lien SO pour plus d'informations: stackoverflow.com/questions/10794587/…
dkb
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>
Sean Patrick Floyd
la source
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.

Irène
la source
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"})
Robocide
la source
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.

Amit Sharma
la source
1

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

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

Santhosh K Thadka
la source