webentwicklung-frage-antwort-db.com.de

Wie kann ich mehrere Pfade mit der Annotation @ComponentScan scannen?

Ich verwende Spring 3.1 und bootstrapping eine Anwendung mit den Attributen @Configuration und @ComponentScan.

Der eigentliche Start erfolgt mit

new AnnotationConfigApplicationContext(MyRootConfigurationClass.class);

Diese Konfigurationsklasse ist mit kommentiert

@Configuration
@ComponentScan("com.my.package")
public class MyRootConfigurationClass

und das funktioniert gut. Ich möchte jedoch genauer auf die Pakete eingehen, die ich scanne, also habe ich es versucht.

@Configuration
@ComponentScan("com.my.package.first,com.my.package.second")
public class MyRootConfigurationClass

Dies schlägt jedoch mit Fehlern fehl, die besagen, dass mit der @Component-Annotation angegebene Komponenten nicht gefunden werden können.

Was ist der richtige Weg, um das zu tun, was ich suche?

Vielen Dank

69
Peter Wilkinson

@ComponentScan verwendet ein String-Array wie folgt:

@ComponentScan({"com.my.package.first","com.my.package.second"})

Wenn Sie mehrere Paketnamen in nur einer Zeichenfolge angeben, interpretiert Spring dies als einen Paketnamen und kann ihn daher nicht finden.

123
hage

Es gibt eine andere typsichere Alternative zur Angabe eines Basispaket-Speicherorts als Zeichenfolge. Siehe API hier , aber ich habe auch unten dargestellt:

@ComponentScan(basePackageClasses = {ExampleController.class, ExampleModel.class, ExmapleView.class})

Wenn Sie den basePackageClasses -Spezifizierer mit Ihren Klassenreferenzen verwenden, wird Spring angewiesen, diese Pakete zu scannen (genau wie die erwähnten Alternativen ), aber diese Methode ist sowohl typsicher als auch fügt IDE-Unterstützung hinzu für zukünftige Refactoring - ein großes Plus in meinem Buch.

Aus der API heraus empfiehlt Spring, in jedem Paket, das Sie scannen möchten, eine No-Op-Markierungsklasse oder -Schnittstelle zu erstellen, die keinem anderen Zweck dient, als als Referenz für/von diesem Attribut verwendet zu werden.

IMO, ich mag die Marker-Klassen nicht (aber sie sind ziemlich genau wie die Package-Info-Klassen) , aber die Typensicherheit, IDE Die Unterstützung und drastische Reduzierung der Anzahl der für diesen Scan erforderlichen Basispakete ist zweifelsohne eine weitaus bessere Option.

42
Prancer

Geben Sie Ihren Paketnamen separat an, für die Paketnamen ist ein String[] erforderlich.

An Stelle von:

@ComponentScan("com.my.package.first,com.my.package.second")

Benutze das:

@ComponentScan({"com.my.package.first","com.my.package.second"})
17
mprabhat

Eine andere Möglichkeit besteht darin, das Feld basePackages zu verwenden. Dies ist ein Feld in der ComponentScan-Annotation.

@ComponentScan(basePackages={"com.firstpackage","com.secondpackage"})

Wenn Sie die ComponentScan-Annotation .class aus der JAR-Datei betrachten, wird ein Feld basePackages angezeigt, das ein Array von Strings enthält

public @interface ComponentScan {
String[] basePackages() default {};
}
9
shashwatZing

Mit ComponentScan scannen Sie mehrere Pakete mit

@ComponentScan({"com.my.package.first","com.my.package.second"})

3
ksw

Sie können auch die @ComponentScans-Annotation verwenden:

@ComponentScans(value = { @ComponentScan("com.my.package.first"),
                          @ComponentScan("com.my.package.second") })
0
Farouk.ch

stellen Sie sicher, dass Sie diese Abhängigkeit in Ihrer pom.xml hinzugefügt haben

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
0