più pacchetti nel contesto: scansione dei componenti, configurazione di primavera


185

Come posso aggiungere più pacchetti nel file spring-servlet.xml context:component-scannell'elemento?

Ho provato

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

e

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

e

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

ma ho ricevuto un errore:

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

Risposte:


272

L'approccio seguente è corretto:

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

Si noti che l'errore si lamenta x.y.z.dao.daoservice.LoginDAO, che non è nei pacchetti sopra menzionati, forse hai dimenticato di aggiungerlo:

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

5
Questa risposta implica che NON c'è ricorsione per i membri del pacchetto di base, MA CI È: stackoverflow.com/questions/7774295/… . Suggerirei di modificare leggermente la risposta per chiarire questo punto.
Djangofan,


43

Puoi aggiungere più pacchetti di base (vedi la risposta di axtavt ), ma puoi anche filtrare ciò che è stato scansionato all'interno del pacchetto di base:

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

2
@shams non c'è bisogno di avvisarmi, ma se la risposta è corretta dovresti contrassegnarla come accettata (clicca il segno di spunta)
Sean Patrick Floyd

1
Perché non puoi aggiungere più pacchetti di base? Ad esempio "org.example, com.example"?
Shervin Asgari,


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

funzionerà dal momento che il resto dei pacchetti sono sotto-pacchetti di "xyz". Pertanto, non è necessario menzionare singolarmente ciascun pacchetto.


2
Ok! Forse era un altro motivo, ma questo non ha funzionato per me con mvc a molla per portlet ...
elcadro,

@elcadro deve aver attraversato altri motivi, dal momento che questa è una funzione ben documentata e pubblicizzata
eis

Bene, non posso dire il contrario poiché molte persone mi stanno correggendo. Vorrei poter scoprire perché questo non ha funzionato per me ... Grazie comunque!
elcadro,

È vero anche per la configurazione basata su annotazioni?
Nikhil Sahu,

6

Un altro approccio di annotazione generale:

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

2

Se xyz è il pacchetto comune, è possibile utilizzare:

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

includerà tutto il pacchetto che inizia con xyz come: xyzcontroller, xyzservice ecc.


1

Ad esempio hai il pacchetto "com.abc" e hai più pacchetti al suo interno, puoi usare like

@ComponentScan("com.abc")

0

Una risposta ritardata ma per fornire più pacchetti usando un approccio basato sulle annotazioni, possiamo usare come di seguito:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.