2008-09-18 4 views

Antwort

19

Vom Spring Docs (v 2.5.5 Section 3.2.2.1.):

Es kann oft nützlich sein Containerdefinitionen in mehrere aufzuteilen XML-Dateien. Eine Möglichkeit, einen Anwendungskontext zu laden, der ist, der aus all diesen XML Fragmenten konfiguriert ist, besteht darin, die Anwendung Kontextkonstruktor zu verwenden, die mehrere Ressourcenstandorte benötigt. Mit einer Bohnenfabrik kann ein Bean-Definitionsleser mehrfach verwendet werden, um nacheinander die Definitionen aus jeder Datei zu lesen.

Im Allgemeinen zieht der Frühling Team die obigen Ansatz, da es hält Container-Konfigurationsdateien nicht bewusst der Tatsache, dass sie mit anderen kombiniert werden. Ein alternativer Ansatz besteht darin, ein oder mehrere Vorkommen des Elements zu verwenden, um Bean Definitionen aus einer anderen Datei (oder Dateien) zu laden. Lassen Sie uns ein Beispiel aussehen:

<import resource="services.xml"/> 
<import resource="resources/messageSource.xml"/> 
<import resource="/resources/themeSource.xml"/> 

<bean id="bean1" class="..."/> 
<bean id="bean2" class="..."/> 

In diesem Beispiel externe Bohne Definitionen von 3 Dateien geladen werden, services.xml, messageSource.xml und themeSource .xml. macht den Import Alle Standortpfade werden die Definitionsdatei als relativ den Import zu tun, so services.xml in diesem Fall muss im selben Verzeichnis oder Classpath Speicherort wie die Datei, während messageSource.xml und themeSource .xml muss sich in einem Ressourcen-Verzeichnis unter dem Speicherort der Importdatei befinden. Wie Sie sehen können, ein führender Schrägstrich wird tatsächlich ignoriert, aber vorausgesetzt, dass diese als relative Pfade betrachtet werden, ist es wahrscheinlich besser Form, den Schrägstrich überhaupt nicht zu verwenden. Der Inhalt der zu importierenden Dateien muss gültige XML-Bean-Definition Dateien gemäß dem Spring Schema oder DTD sein, einschließlich der obersten Ebene Element.

+0

Absolute Übereinstimmung mit den Spring-Dokumenten: Aggregation von Konfigurationsdateien schlägt jedes Mal explizite Importe. Wenn nichts anderes als für Unit-Tests. –

2

Ja, Sie können dies über das Element import tun.

<import resource="services.xml"/> 

jede Ressource Attribut des Elements ist ein gültiger Pfad (zB Classpath: foo.xml)

3

Wir tun dies in unseren Projekten bei der Arbeit, mit dem Ressourcenlader classpath * im Frühjahr. Für eine bestimmte App, alle appcontext Dateien, um die Anwendungs-ID enthält, wird geladen:

classpath*:springconfig/spring-appname-*.xml 
+0

Ich bin verwirrt. neue ClassPathResource ("classpath *: springconfig/spring-appname - *. xml") ist, was Sie vorschlagen? –

+1

muss nicht zustimmen. Wir haben mit diesem Ansatz gearbeitet und es führt immer zum Laden der falschen Konfigurationsdatei. In unserem Fall hatten wir die Quell-XML-Dateien in einem speziellen "conf" -Ordner, aber offensichtlich versteckten sie sich auch in den verschiedenen Gläsern. Dieser Ansatz lädt ALLE Konfigurationsdateien von einer beliebigen Stelle im Klassenpfad und überschreibt diejenigen, von denen Sie glauben, dass sie geladen sind. – ihadanny

+0

Wichtiger Kontext: "appname" ist natürlich spezifisch für die Anwendung, die wir erstellen, und die verschiedenen Spring-Kontextdateien befinden sich in Maven-Modulen, wo das spezifischste Anwendungsmodul die anderen Teile von seinen Abhängigkeiten erbt. Außerdem sollte das Dateinamensmuster Sie davor schützen, zufällige Dateien aufzunehmen. –

2

gegeben, was Nicholas mich deutete auf ich dies in der Dokumentation gefunden. Es ermöglicht mir, zur Laufzeit die Bean-Kontexte auszuwählen, an denen ich interessiert bin.

GenericApplicationContext ctx = new GenericApplicationContext(); 
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx); 
xmlReader.loadBeanDefinitions(new ClassPathResource("modelContext.xml")); 
xmlReader.loadBeanDefinitions(new ClassPathResource("uiContext.xml")); 
ctx.refresh(); 
1

Hier ist, was ich für eines meiner Projekte getan habe. In Ihrer web.xml-Datei können Sie die Spring-Bean-Dateien definieren Sie Ihre Anwendung verwenden möchten:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/applicationContext.xml 
     /WEB-INF/modelContext.xml 
     /WEB-INF/ui.xml 
    </param-value> 
    </context-param> 

Wenn dies nicht in Ihrem web.xml definiert wird, sucht es automatisch für /WEB-INF/applicationContext.xml

+0

Ich verwende nicht Spring MVC, nur die IOC –

0

Eine andere Sache ist zu beachten, Obwohl Sie dies tun können, wenn Sie kein großer Fan von XML sind, können Sie in Spring 2.5 mit Anmerkungen eine Menge Dinge tun.

0

Ja, Sie können das Tag innerhalb der Bean-Datei "Master" verwenden. Aber was ist mit dem Warum? Warum listet man die Dateien nicht im contextConfigLocation-Kontextparameter des wab.xml- oder als locs-Arrays der Bean-Factory auf?

Ich denke, dass mehrere Dateien viel einfacher zu handhaben sind. Sie können nur einige von ihnen für einen Test auswählen, einfach umbenennen oder einen Teil der Anwendung entfernen, und Sie können verschiedene Anwendungen mit den gleichen Konfigurationsdateien (eine Webapp und eine Kommandozeilenversion mit einigen überlappenden Bean-Definitionen) umgrenzen.