Путь расположения или пути, передаваемые конструктору ApplicationContext, являются строками ресурсов, которые позволяют контейнеру загружать из различных внешних ресурсов, таких как локальная файловая система, Java CLASSPATH и так далее.

Java
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
Kotlin
val context = ClassPathXmlApplicationContext("services.xml", "daos.xml")

После изучения IoC-контейнера Spring вы, возможно, захотите узнать больше об абстракции Spring Resource, которая предоставляет удобный механизм для чтения InputStream из мест, определенных в синтаксисе URI. В частности, пути Resource используются для построения контекстов приложений.

В следующем примере показан файл конфигурации объектов уровня служб (services.xml):

<?xml version="1.0" encoding="UTF-8"?>
<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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- службы -->
    <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
        <property name="accountDao" ref="accountDao"/>
        <property name="itemDao" ref="itemDao"/>
        <!-- дополнительные взаимодействующие объекты и конфигурация для этого бина находятся здесь -->
    </bean>
    <!-- больше определений бина для служб находятся здесь -->
</beans>

В следующем примере показан файл daos.xml объектов доступа к данным:

<?xml version="1.0" encoding="UTF-8"?>
<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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="accountDao"
        class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
        <!-- дополнительные взаимодействующие объекты и конфигурация для этого бина находятся здесь -->
    </bean>
    <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
        <!-- дополнительные взаимодействующие объекты и конфигурация для этого бина находятся здесь -->
    </bean>
    <!-- больше определений бина для объектов доступа к данным находятся здесь -->
</beans>

В предыдущем примере уровень служб состоит из класса PetStoreServiceImpl и двух объектов доступа к данным типов JpaAccountDao и JpaItemDao (на основе стандарта объектно-реляционного отображения JPA Object-Relational Mapping). Элемент property name ссылается на имя свойства JavaBean, а элемент ref ссылается на имя другого определения бина. Эта связь между элементами id и ref выражает зависимость между взаимодействующими объектами.

Составление конфигурационных метаданных на основе XML

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

Можно использовать конструктор контекста приложения для загрузки определений бинов из всех этих XML-фрагментов. Данный конструктор занимает несколько местоположений Resource. В качестве альтернативы, используйте одно или несколько вхождений элемента для загрузки определений бинов из другого файла или файлов. В следующем примере показано, как это сделать:

<beans>
    <import resource="services.xml"/>
    <import resource="resources/messageSource.xml"/>
    <import resource="/resources/themeSource.xml"/>
    <bean id="bean1" class="..."/>
    <bean id="bean2" class="..."/>
</beans>

В предыдущем примере внешние определения бинов загружаются из трех файлов: services.xml, messageSource.xml и themeSource.xml. Все пути расположения относятся к файлу определения, выполняющему импорт, поэтому services.xml должен находиться в том же каталоге или classpath, что и файл, выполняющий импорт, а messageSource.xml и themeSource.xml должны находиться в resources, расположенных ниже расположения импортируемого файла. Как вы видите, ведущий слеш игнорируется. Однако, учитывая, что эти пути являются относительными, лучше вообще не использовать слеш. Содержимое импортируемых файлов, включая элемент верхнего уровня <bean/>, должно быть действительным XML-определением бина, согласно схеме Spring (Spring Schema).

Можно, но не рекомендуется, ссылаться на файлы в родительских каталогах, используя относительный путь "../". Это создает зависимость от файла, который находится за пределами текущего приложения. В частности, такую ссылку не рекомендуется использовать для classpath: (например, classpath:../services.xml), где с помощью процедуры разрешения во время выполнения выбирается "ближайший" корень classpath, а затем просматривается его родительский каталог. Изменения конфигурации пути класса могут привести к выбору другого, неправильного каталога.

Вы всегда можете использовать полностью определенное расположение ресурсов вместо относительных путей: например, file:C:/config/services.xml или classpath:/config/services.xml. Однако имейте в виду, что вы привязываете конфигурацию своего приложения к определенным абсолютным местоположениям. Обычно предпочтительнее сохранять косвенную адресацию для таких абсолютных местоположений - например, через плейсхолдеры "${....}", которые разрешаются в отношении системных свойств JVM во время выполнения.

Само пространство имен обеспечивает возможность использования директивы импорта. Дополнительные возможности конфигурации, помимо простых определений бинов, доступны в некоторых пространствах имен XML, предоставляемых Spring (например, пространства имен context и util).

Определение бинов с помощью Groovy DSL

В качестве дополнительного примера метаданных, конфигурация которых вынесена во внешний файл, определения бинов также могут быть выражены с помощью определения через Groovy DSL в Spring, как это известно по фреймворку Grails. Обычно такая конфигурация находится в файле ".groovy" и имеет структуру, показанную в следующем примере:

beans {
    dataSource(BasicDataSource) {
        driverClassName = "org.hsqldb.jdbcDriver"
        url = "jdbc:hsqldb:mem:grailsDB"
        username = "sa"
        password = ""
        settings = [mynew:"setting"]
    }
    sessionFactory(SessionFactory) {
        dataSource = dataSource
    }
    myService(MyService) {
        nestedBean = { AnotherBean bean ->
            dataSource = dataSource
        }
    }
}

Этот стиль конфигурации во многом эквивалентен XML-определениям бинов и даже поддерживает XML-пространства имен конфигурации Spring. Он также позволяет импортировать XML-файлы определения бинов с помощью директивы importBeans.