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.