Puis-je composer un fichier de configuration de printemps à partir de fichiers plus petits?
Question
J'ai une poignée de projets qui utilisent tous un projet pour le modèle de données. Chacun de ces projets a son propre fichier applicationContext.xml contenant un tas de données répétitives.
J'aimerais disposer d'un fichier modelContext.xml et d'un autre pour mon ui.xml, etc.
Puis-je faire cela?
La solution
Extrait de la Spring Docs (v 2.5. 5 Section 3.2.2.1.) :
Il peut souvent être utile de se séparer définitions de conteneurs en plusieurs Fichiers XML. Une façon de charger ensuite un contexte d'application qui est configuré à partir de tous ces XML fragments est d'utiliser l'application constructeur de contexte qui prend plusieurs emplacements de ressources. Avec un usine de haricot, un lecteur de définition de haricot peut être utilisé plusieurs fois pour lire définitions à partir de chaque fichier.
En règle générale, l'équipe de Spring préfère le ci-dessus approche, car il garde fichiers de configuration de conteneur non conscients du fait qu'ils sont combiné avec d'autres. Un remplaçant approche consiste à utiliser un ou plusieurs occurrences de l'élément charger les définitions de beans d'un autre fichier (ou fichiers). Regardons un échantillon:
<import resource="services.xml"/> <import resource="resources/messageSource.xml"/> <import resource="/resources/themeSource.xml"/> <bean id="bean1" class="..."/> <bean id="bean2" class="..."/>
Dans cet exemple, bean externe les définitions sont chargées à partir de 3 fichiers, services.xml, messageSource.xml, et themeSource.xml. Tous les chemins de localisation sont considérés par rapport à la fichier de définition faisant l'importation, alors services.xml dans ce cas doit être dans le même répertoire ou chemin de classe emplacement en tant que fichier faisant le importer, pendant que messageSource.xml et themeSource.xml doit figurer dans une ressource emplacement en dessous de l'emplacement du fichier d'importation. Comme vous pouvez le voir, un la barre oblique est ignorée, mais étant donné que ceux-ci sont considérés chemins relatifs, il vaut probablement mieux forme de ne pas utiliser la barre oblique du tout. le contenu des fichiers en cours d'importation doit être une définition de bean XML valide fichiers selon le schéma de printemps ou DTD, y compris le niveau supérieur élément.
Autres conseils
Nous le faisons dans nos projets au travail, en utilisant le chargeur de ressources classpath * de Spring. Pour une application donnée, tous les fichiers appcontext contenant l'identifiant de l'application seront chargés:
classpath*:springconfig/spring-appname-*.xml
Oui, vous pouvez le faire via l'élément d'importation.
<import resource="services.xml"/>
L'attribut de ressource de chaque élément est un chemin valide (par exemple, classpath: foo.xml)
Étant donné ce que Nicholas m'a indiqué, j'ai trouvé ceci dans la documentation. Cela me permet de choisir au moment de l'exécution les contextes de haricots qui m'intéressent.
GenericApplicationContext ctx = new GenericApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
xmlReader.loadBeanDefinitions(new ClassPathResource("modelContext.xml"));
xmlReader.loadBeanDefinitions(new ClassPathResource("uiContext.xml"));
ctx.refresh();
Voici ce que j'ai fait pour l'un de mes projets. Dans votre fichier web.xml
, vous pouvez définir les fichiers de bean Spring que vous souhaitez que votre application utilise:
<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>
S'il n'est pas défini dans votre web.xml
, il recherche automatiquement /WEB-INF/applicationContext.xml
Une autre chose à noter est que bien que vous puissiez le faire, si vous n'êtes pas un grand fan de XML, vous pouvez faire beaucoup de choses dans Spring 2.5 avec des annotations.
Oui, vous pouvez utiliser la balise à l'intérieur du " Maître " fichier de haricot. Mais qu'en est-il du pourquoi? Pourquoi ne pas lister les fichiers dans le paramètre de contexte contextConfigLocation du tableau wab.xml ou als de la fabrique de beans?
Je pense que plusieurs fichiers sont beaucoup plus faciles à manipuler. Vous pouvez choisir uniquement certains d’entre eux pour un test, ajouter simplement renommer ou supprimer une partie de l’application et lier différentes applications avec les mêmes fichiers de configuration (une application Web et une version en ligne de commande avec des définitions de beans superposées).