Ich verwende Spring 3.1 und boote eine Anwendung mit den Attributen @Configuration
und @ComponentScan
.
Der eigentliche Start ist erledigt mit
new AnnotationConfigApplicationContext(MyRootConfigurationClass.class);
Diese Konfigurationsklasse ist mit Anmerkungen versehen
@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 darauf hinweisen, dass die mit der @Component
Anmerkung angegebenen Komponenten nicht gefunden werden können .
Was ist der richtige Weg, um das zu tun, wonach ich suche?
Vielen Dank
java
spring
annotations
Programmierer
quelle
quelle
Antworten:
@ComponentScan verwendet ein String-Array wie folgt :
Wenn Sie mehrere Paketnamen in nur einer Zeichenfolge angeben, interpretiert Spring dies als einen Paketnamen und kann ihn daher nicht finden.
quelle
Es gibt eine andere typsichere Alternative zur Angabe eines Basispaketstandorts als Zeichenfolge. Siehe die API hier , aber ich habe auch unten illustriert:
Wenn Sie den basePackageClasses-Bezeichner mit Ihren Klassenreferenzen verwenden, wird Spring angewiesen , diese Pakete zu scannen (genau wie die genannten Alternativen ). Diese Methode ist jedoch sowohl typsicher als auch bietet zusätzliche IDE-Unterstützung für zukünftigen Refactoring - ein großes Plus in meinem Buch.
Ausgehend von der API schlägt Spring vor, in jedem Paket, das Sie scannen möchten, eine No-Op-Marker-Klasse 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 andererseits sind sie ziemlich genau wie die Paket-Info-Klassen), aber die Typensicherheit, die IDE-Unterstützung und die drastische Reduzierung der Anzahl der Basispakete , die für diesen Scan benötigt werden ist ohne Zweifel eine weitaus bessere Option.
quelle
Geben Sie Ihren Paketnamen separat an.
String[]
Für Paketnamen ist ein Paketname erforderlich .An Stelle von:
Benutze das:
quelle
Eine andere Möglichkeit, dies zu tun, ist die Verwendung des
basePackages
Feldes. Dies ist ein Feld innerhalb der ComponentScan-Annotation.Wenn Sie sich die ComponentScan-Annotation .class aus der JAR-Datei ansehen, sehen Sie ein basePackages-Feld, das ein Array von Strings enthält
Oder Sie können die Klassen explizit erwähnen. Welches in Reihe von Klassen nimmt
quelle
Mit ComponentScan scannen Sie mehrere Pakete mit
@ComponentScan({"com.my.package.first","com.my.package.second"})
quelle
Stellen Sie sicher, dass Sie diese Abhängigkeit in Ihrer pom.xml hinzugefügt haben
quelle
Ich benutze:
quelle
Sie können auch die Annotation @ComponentScans verwenden:
quelle