У меня есть Spring bean, определенный в XML файле. Я хочу ссылаться на него из другого XML файла. Как я могу это сделать?
Как ссылаться на bean другого xml файла в spring
Ответ 1
У вас есть несколько вариантов:
Импорт
<import resource="classpath:config/spring/that-other-xml-conf.xml"/>
<bean id="yourCoolBean" class="org.jdong.MyCoolBean">
<property name="anotherBean" ref="thatOtherBean"/>
</bean>
Включить в конструкцию ApplicationContext
Конструкция
Сделайте оба файла частью вашего ApplicationContext
при его создании = > , тогда импорт не требуется.
Например, если вам это нужно во время тестирования:
@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 {...}
Если это веб-приложение, вы сделаете это в 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>
Если это автономное приложение, библиотека и т.д., вы загрузите свой ApplicationContext
как:
new ClassPathXmlApplicationContext(
new String[] { "classpath:META-INF/conf/spring/this-xml-conf.xml",
"classpath:META-INF/conf/spring/that-other-xml-conf.xml" } );
Ответ 2
Просто импортируйте xml, определяющий bean с <import resource="otherXml.xml">
, и вы сможете использовать определение bean.
Вы можете использовать classpath:
в атрибуте resource
:
<import resource="classpath:anotherXXML.xml" />
См. "3.18. Импорт bean Определений из одного файла в другой" в в этой главе справочника Spring
Ответ 3
Вы ссылаетесь на него точно так же, как ссылаетесь на bean в том же файле XML. Если контекст spring состоит из нескольких файлов XML, все beans являются частью одного и того же контекста и, таким образом, совместно используют уникальное пространство имен.
Ответ 4
Или, если вы просто рефакторируете beans в несколько файлов, чтобы один файл xml не увеличивался, просто ссылайтесь на него из его текущей папки:
<import resource="processors/processor-beans.xml"/>
Ответ 5
Вы также можете пойти об этом, загрузив в код несколько конфигурационных файлов Spring bean:
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"Spring-Common.xml", "Spring-Connection.xml","Spring-ModuleA.xml"});
Поместите все Spring xml файлы в путь к классу проекта:
project-classpath/Spring-Common.xml
project-classpath/Spring-Connection.xml
project-classpath/Spring-ModuleA.xml
Однако вышеприведенная реализация - это отсутствие организации и склонности к ошибкам, лучше всего организовать все ваши конфигурационные файлы Spring bean в один файл XML. Например, создайте файл Spring-All-Module.xml
и импортируйте все файлы Spring bean следующим образом:
<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>
Теперь вы можете загрузить один файл xml следующим образом:
ApplicationContext context =
new ClassPathXmlApplicationContext(Spring-All-Module.xml);
Примечание В Spring3 альтернативное решение использует JavaConfig @Import.
Ответ 6
Ответ от tolitius очень подробный. Просто для проблемы, упомянутой Петром Бутковичем
для меня web.xml выкидывает ошибку. Кажется, что одно значение параметра допускается только на месте. - Петр Буткович
Я столкнулся с той же проблемой и решил, разделив два пути с помощью "," в одном теге.
Это будет выглядеть так
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml,
/WEB-INF/daoContext.xml
</param-value>
</context-param>