доступ к bean-компоненту, определенному в xml, из другого xml-файла в Spring 4 - PullRequest
0 голосов
/ 11 октября 2018

В Spring web app у меня есть некоторые распространенные bean-компоненты, такие как dataSource, transactionManager, mailSender и т. Д., Определенные в XML-файле.У меня также есть много других XML-файлов, которые я использую для запуска некоторых задач, и я импортирую их здесь:

servlet.xml:

<bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
        p:driverClassName="${jdbc.driverClassName}"
        p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
        p:password="${jdbc.password}"
        p:initialSize="1"
        p:maxWait="30000"
        p:maxIdle="-1"
        p:maxActive="-1" />

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
</bean>
<import resource="aTaskStarter.xml"/>

Теперь в файле aTaskStarter.xmlЯ хотел бы получить доступ к этим bean-компонентам и передать их классу java:

aTaskStarter.xml:

<bean id="dailyReportTask" class="com.package.task.MyTask">
    <property name="dataSource" ref="dataSource" />
</bean>

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы должны просто перенести импорт до определения bean-компонентов, и все должно функционировать так, как вы ожидаете ...

В документации указано:

Часто полезно разделить контейнеропределения в несколько файлов XML.Один из способов затем загрузить контекст приложения, который настроен из всех этих фрагментов XML, - это использовать конструктор контекста приложения, который принимает несколько расположений ресурсов.При использовании фабрики bean-компонентов средство чтения определений bean-компонентов может использоваться несколько раз для считывания определений из каждого файла по очереди.

Обычно команда Spring предпочитает вышеуказанный подход, поскольку она сохраняет файлы конфигурации контейнера, не зная о том, чтоони объединяются с другими.Однако альтернативный подход состоит в том, чтобы из одного файла определения XML-компонента использовать один или несколько экземпляров элемента импорта для загрузки определений из одного или нескольких других файлов.Любые элементы импорта должны быть помещены перед элементами bean в файле, выполняющем импорт.Давайте рассмотрим пример:

<beans>

  <import resource="services.xml"/>

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

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

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

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

В этом примере определения внешних компонентов загружаются из 3 файлов: services.xml, messageSource.xml и themeSource.xml.Все пути расположения рассматриваются относительно файла определения, выполняющего импорт, поэтому services.xml в этом случае должен находиться в том же каталоге или в каталоге, где находится файл, выполняющий импорт, тогда как messageSource.xml и themeSource.xml должны находиться в ресурсах.расположение под расположением файла импорта.Как видите, начальная косая черта фактически игнорируется, но, учитывая, что они считаются относительными путями, вероятно, лучше не использовать косую черту вообще.

Содержимое импортируемых файлов должно быть полностьюдопустимые файлы определения XML-бинов в соответствии с DTD, включая элемент бинов верхнего уровня.

0 голосов
/ 11 октября 2018

поместите общий материал в третий файл XML и включите его в два других файла:

<import resource="common.xml" />
...