2017-04-03 5 views
0

Ich bin jetzt verwirrt mit Paketen. Es ist wie folgt aufgeteilt: Simple Maven Multimodul Projekt. Ein Eltern-POM, zwei Geschwistermodul-Kinder (eines ist ein Servicemodul, eines ist ein Web-Modul, das in Tomcat ausgeführt wird).Wie scannt Spring basePackages meine Klassen von einem anderen Maven-Modul?

Unten ist meine Spring Annotation Config für Dispatcher Servlet. Hier bin ich verwirrt. Zuerst dachte ich nicht, dass basePackages in der Lage sein würde, nach Paketen in einem völlig separaten Modul zu suchen (was das Servicemodul ist). Es funktionierte jedoch irgendwie, genau wie unten beschrieben. "Entitäten" und "Services" sind die beiden Pakete aus dem Service-Modul, während "Controller" von diesem Web-Modul stammen. Lassen Sie es bekannt, dass ich tatsächlich das Service-Modul als eine Abhängigkeit in meinem Web-Modul hinzugefügt haben. Nichts verrücktes geht da vor. Einfache Abhängigkeit, damit ich Zugriff auf meine Serviceklassen haben kann.

@EnableWebMvc 
@Configuration 
@ComponentScan(basePackages={"entities", "services", "controllers"}) 
public class DispatcherConfig { 

} 

Was ich nicht verstehe ist, wie die Verpackung funktioniert. Es ist alles Spaghetti in meinem Kopf jetzt. Wenn Spring zu der Zeile @ComponentScan kommt und "Entitäten" und "Dienste" sieht, welche Struktur sucht es, um diese Klassen zu erhalten?

Meine Paketstruktur ist sehr einfach. Im Servicemodul habe ich einfach src/main/java/Entitäten und src/main/java/Dienstleistungen

Etwas hinter den Kulissen geschieht hier, die ich nicht verstehe. Wie kommt es, dass der Frühling schlau genug ist, das zu wissen? Ich musste nicht einmal das vollständige Paket auflisten, also myproject/src/main/java/entities oder so ähnlich?

Dank

+1

Ein bisschen veraltet, aber das Prinzip ist das gleiche: https://nofluffjuststuff.com/blog/scott_leberknight/2008/06/just_how_does_spring_do_its_classpath_component_scanning_magic_ – chrylis

+1

Ihre Frage zu sein scheint, wie Frühling der Lage ist, „an verschiedene Maven Module Blick in ". Nun, Maven-Module sind etwas synthetisches für die Verwaltung Ihrer Projekte. Wenn es um eine laufende Java-Anwendung geht, gibt es nur Klassen und Ressourcen in Ihrem Klassenpfad. Auf alle Elemente in Ihrem Klassenpfad kann auf verschiedene Arten zugegriffen werden (siehe zum Beispiel org.springframework.context.annotation.ClassPathBeanDefinitionScanner). Spring führt während der Laufzeit alle Scans durch, so dass verschiedene Maven-Module aus der Sicht der Federn nicht mehr existieren. – samjaf

+1

'entities' * ist * das Paket ... Es gibt keine' src/main/java/entities', die nur Ihre Projektstruktur ist. Entpacken Sie einfach die JAR-Datei, die vom Projekt geliefert wird, und Sie sehen nur ein 'entities'-Paket. Spring scannt nur den Klassenpfad und alle Pakete befinden sich im Klassenpfad. Für den Frühling (oder Klassenlader im Allgemeinen) gibt es keine verschiedenen Pakete/Module. –

Antwort

0

nehme @ComponentScan String-Array verwendet, wie folgt aus:

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

Wenn Sie in einer Zeichenkette nur mehrere Paketnamen liefern, interpretiert Frühling dies als ein Paketnamen.

Diese post könnte hilfreich sein.

Verwandte Themen