J'ai un bean Spring défini dans un fichier xml. Je veux le référencer à partir d'un autre fichier xml. Comment puis-je m'y prendre?
Vous avez plusieurs options:
<import resource="classpath:config/spring/that-other-xml-conf.xml"/>
<bean id="yourCoolBean" class="org.jdong.MyCoolBean">
<property name="anotherBean" ref="thatOtherBean"/>
</bean>
ApplicationContext
Intégrez les deux fichiers à votre ApplicationContext
lorsque vous le créez => alors aucune importation n'est nécessaire.
Par exemple, si vous en avez besoin pendant les tests:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:META-INF/conf/spring/this-xml-conf.xml",
"classpath:META-INF/conf/spring/that-other-xml-conf.xml" })
public class CleverMoneyMakingBusinessServiceIntegrationTest {...}
Dans le cas où il s'agit d'une application Web, vous le feriez dans web.xml
:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/conf/spring/this-xml-conf.xml</param-value>
<param-value>WEB-INF/conf/spring/that-other-xml-conf.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
S'il s'agit d'une application autonome, d'une bibliothèque, etc., vous chargez votre ApplicationContext
comme:
new ClassPathXmlApplicationContext(
new String[] { "classpath:META-INF/conf/spring/this-xml-conf.xml",
"classpath:META-INF/conf/spring/that-other-xml-conf.xml" } );
Importez simplement le xml définissant le bean avec <import resource="otherXml.xml">
et vous pourrez utiliser la définition du bean.
Vous pouvez utiliser classpath:
dans l'attribut resource
:
<import resource="classpath:anotherXXML.xml" />
Reportez-vous à la section "3.18. Importation de définitions de bean d'un fichier dans un autre" dans ce chapitre de la référence Spring
Vous le référencez exactement comme vous référenceriez un bean dans le même fichier XML. Si un contexte Spring est composé de plusieurs fichiers XML, tous les beans font partie du même contexte et partagent ainsi un espace de noms unique.
Ou si vous refactorisez simplement les beans dans plusieurs fichiers pour empêcher le fichier xml unique de grossir, faites-le simplement référence à partir de son dossier actuel:
<import resource="processors/processor-beans.xml"/>
Vous pouvez également vous y prendre en chargeant plusieurs fichiers de configuration du bean Spring dans le code:
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"Spring-Common.xml", "Spring-Connection.xml","Spring-ModuleA.xml"});
Placez tous les fichiers XML Spring sous le chemin d'accès aux classes du projet:
project-classpath/Spring-Common.xml
project-classpath/Spring-Connection.xml
project-classpath/Spring-ModuleA.xml
Cependant, l'implémentation ci-dessus est un manque d'organisation et sujette aux erreurs, la meilleure façon devrait être d'organiser tous vos fichiers de configuration Spring Bean en un seul fichier XML. Par exemple, créez un Spring-All-Module.xml
fichier, et importez l'intégralité des fichiers Spring Bean comme ceci:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<import resource="common/Spring-Common.xml"/>
<import resource="connection/Spring-Connection.xml"/>
<import resource="moduleA/Spring-ModuleA.xml"/>
</beans>
Vous pouvez maintenant charger un seul fichier xml comme celui-ci:
ApplicationContext context =
new ClassPathXmlApplicationContext(Spring-All-Module.xml);
Remarque Dans Spring3, la solution alternative utilise JavaConfig @Import .