Wo soll die Spring-Konfigurationsdatei abgelegt werden?

18

Ich möchte Spring Framework in mein Projekt integrieren, insbesondere auf der Serverseite.

Ich möchte es also nicht in den WEB-INF-Ordner der Kriegsdatei legen.

Soll ich eine applicationContext.xml in jede Ebene einfügen (bedeutet, dass jedes Projekt in verschiedene Projekte unterteilt ist? (Dienste, Domäne und DAO)

Was ist die gute Praxis?

Mik378
quelle
2
Dies kann relevant sein: stackoverflow.com/questions/5967405/…
NoChance

Antworten:

25

Die Maven-Dateistruktur kann dabei helfen

Im Wesentlichen werden die Spring-Konfigurationsdateien (die übrigens einen beliebigen Namen haben können, nicht nur die generischen applicationContext.xml) als Klassenpfadressourcen behandelt und unter abgelegt src/main/resources. Während des Erstellungsprozesses werden diese dann in das WEB-INF/classesVerzeichnis kopiert, in dem sich diese Dateien normalerweise befinden.

Variationen enthalten ein zusätzliches springVerzeichnis (z. B. src/main/resources/spring), um die Spring-Kontexte von anderen Ressourcen für Anwendungsframeworks zu trennen. Möglicherweise möchten Sie die Anwendungskontexte in bestimmte Ebenen aufteilen, z.

example-servlet.xml
example-data.xml
example-security.xml

und so weiter.

Was ist mit verschiedenen Umgebungen wie dev / test / production?

In der Regel sollte Ihre Spring-Konfiguration die Umgebungskonfiguration aus ihrer, ahem, -Umgebung übernehmen. In der Regel bedeutet dies, dass Sie JNDI, JDBC, Umgebungsvariablen oder externe Eigenschaftendateien verwenden, um die erforderliche Konfiguration bereitzustellen. Ich liste diese nach Präferenz auf, da JNDI im Allgemeinen einfacher zu verwalten ist als externe Eigenschaftendateien in einem kontrollierten Produktionscluster.

Im Falle von Integrationstests müssen Sie möglicherweise eine reine Test-Spring-Konfigurationsdatei verwenden. Dies würde spezielle Kontexte enthalten, die Test-Beans oder Konfigurationen verwenden. Diese befinden sich unter src / test / resources und haben möglicherweise ein test-Präfix, um sicherzustellen, dass sich die Entwickler ihres Zwecks bewusst sind. Eine typische Verwendung wäre, eine Nicht-JNDI-DataSource bereitzustellen, die möglicherweise eine HSQLDB-Datenbank während der automatisierten Tests erstellt und im Testfall referenziert.

Im Allgemeinen sollten die meisten Ihrer Spring-Kontextdateien jedoch keine speziellen Änderungen erfordern, da sie zwischen den Ebenen verschoben werden. Es sollte der Fall sein, dass dasselbe Build-Artefakt (z. B. WAR-Datei) in dev / test / production nur mit unterschiedlichen Anmeldeinformationen verwendet wird.

Gary Rowe
quelle
2

Ist Ihr Projekt in Maven-Module aufgeteilt? In diesem Fall können Sie ein zusätzliches Modul nur für Konfigurationsdateien hinzufügen. Nennen wir es Config-Modul

config-module
      |
      |--> src\main\resources\config\spring\applicationContex.xml
      |--> src\main\resources\config\properties\application.properties
      |--> pom.xml

Eine solche Konfiguration ist ein Vorschlag. Richten Sie Ihren eigenen Dateisatz ein Packen Sie ihn wie eine JAR und fügen Sie dieses Modul als Abhängigkeit von einem anderen Modul (Web, Ear's Lib, eine andere JAR) hinzu.

Sie haben Zugriff auf Konfigurationsmodulressourcen (XML, Eigenschaften usw.), da sie sich im Klassenpfad befinden.

web-module's pom

<dependency>
    <groupId>com.myproject.group</groupId>
    <artifactId>config-module</artifactId>
</dependency>

Verwenden Sie dann Importanweisungen aus externen Spring-Kontextdateien. Beispielsweise

<import resource="classpath*:com/package/subpackage/**/config/applicationContext.xml" />
Laiv
quelle
Das war eine großartige Idee! Ich habe mir erlaubt, ein kleines Extra hinzuzufügen, weil Ihr Beispiel für "Importressource" bei mir nicht funktioniert hat. Ich lerne immer noch das "Filtern" der import-Anweisung (basierend auf dem vollständigen Paketnamen). und ich habe diesen Schluckauf (für zukünftige Leser) nicht gemacht, um von dieser großartigen Idee und Antwort abzulenken. Vielen Dank, Laiv!
GranadaCoder
Einer der Gründe, warum Ihr Import "was ich denke sollte funktionieren" fehlschlägt, ist dieser Fehler: github.com/spring-projects/spring-framework/issues/16017
granadaCoder