Подтвердить что ты не робот

Как ссылаться на bean другого xml файла в spring

У меня есть Spring bean, определенный в XML файле. Я хочу ссылаться на него из другого XML файла. Как я могу это сделать?

4b9b3361

Ответ 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>