Mehrere Pakete im Kontext: Komponentenscan, Spring-Konfiguration

185

Wie kann ich mehrere Pakete in der Datei spring-servlet.xml im context:component-scanElement hinzufügen ?

Ich habe versucht

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

und

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

und

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

habe aber Fehler bekommen:

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

Antworten:

271

Der folgende Ansatz ist richtig:

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

Beachten Sie, dass sich der Fehler beschwert x.y.z.dao.daoservice.LoginDAO, der nicht in den oben genannten Paketen enthalten ist. Vielleicht haben Sie vergessen, ihn hinzuzufügen:

<context:component-scan base-package="x.y.z.service, x.y.z.controller, x.y.z.dao" /> 
axtavt
quelle
5
Diese Antwort impliziert, dass es für die Mitglieder des Basispakets KEINE Rekursion gibt, ABER es gibt: stackoverflow.com/questions/7774295/… . Ich würde vorschlagen, die Antwort ein wenig zu ändern, um dies klar zu machen.
Djangofan
52

Annotation-Ansatz

@ComponentScan({ "x.y.z", "x.y.z.dao" })
Biologie.info
quelle
Müssen wir zwangsweise bestimmte Pakete hinzufügen, oder kann es Unterpakete automatisch scannen, wenn wir nur das Paket der obersten Ebene definieren?
Nikhil Sahu
@NikhilSahu nein, es ist ein rekursiver Scan (Frühling 3>)
Biology.info
SO Link für weitere Informationen: stackoverflow.com/questions/10794587/…
dkb
43

Sie können mehrere Basispakete hinzufügen (siehe Antwort von axtavt ), aber Sie können auch filtern, was im Basispaket gescannt wurde :

<context:component-scan base-package="x.y.z">
   <context:include-filter type="regex" expression="(service|controller)\..*"/>
</context:component-scan>
Sean Patrick Floyd
quelle
2
@shams keine Notwendigkeit, mich zu Sir, aber wenn die Antwort richtig ist, sollten Sie es als akzeptiert markieren (klicken Sie auf das Häkchen)
Sean Patrick Floyd
1
Warum können Sie nicht mehrere Basispakete hinzufügen? Wie zum Beispiel "org.example, com.example"?
Shervin Asgari
@Shervin du kannst. genau wie du geschrieben hast. "Alternativ können Sie eine durch Kommas getrennte Liste angeben, die das übergeordnete Paket jeder Klasse enthält." (siehe auch die erwartete Antwort)
Sean Patrick Floyd
19
<context:component-scan base-package="x.y.z"/>

wird funktionieren, da der Rest der Pakete Unterpakete von "xyz" sind. Sie müssen also nicht jedes Paket einzeln erwähnen.

Irene
quelle
2
OK! Vielleicht war es ein anderer Grund, aber das funktionierte einfach nicht für mich mit Spring MVC für Portlets ...
Elcadro
@elcadro muss andere Gründe durchgemacht haben, da dies eine gut dokumentierte und beworbene Funktion ist
Eis
Nun, ich kann nicht das Gegenteil sagen, da mich viele Leute korrigieren. Ich wünschte, ich könnte herausfinden, warum das bei mir nicht funktioniert hat ... Trotzdem danke!
Elcadro
Gilt das auch für die annotationsbasierte Konfiguration?
Nikhil Sahu
6

Ein weiterer allgemeiner Annotation-Ansatz:

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

Wenn xyz das übliche Paket ist, können Sie Folgendes verwenden:

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

Es enthält alle Pakete, die mit xyz beginnen, wie z. B.: xyzcontroller, xyzservice usw.

Amit Sharma
quelle
1

Zum Beispiel haben Sie das Paket "com.abc" und Sie haben mehrere Pakete darin, die Sie wie verwenden können

@ComponentScan("com.abc")
sForSujit
quelle
0

Eine verzögerte Antwort, aber um mehrere Pakete unter Verwendung eines annotationsbasierten Ansatzes zu geben, können wir wie folgt verwenden:

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

Santhosh K Thadka
quelle