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:

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" /> 

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


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>

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


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.


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"})

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.


1

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

@ComponentScan("com.abc")

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"})

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.