Путь расположения или пути, передаваемые конструктору ApplicationContext
, являются строками ресурсов, которые позволяют контейнеру загружать из различных внешних ресурсов, таких как локальная файловая система, Java CLASSPATH
и так далее.
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
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
.