JavaRush/Курсы/Модуль 5. Spring/Создание экземпляра IoC-контейнера

Создание экземпляра IoC-контейнера

Открыта

Путь расположения или пути, передаваемые конструктору 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.

Комментарии (11)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Родион
Уровень 113
13 августа 2025, 12:15
очередная ахинея при температуре 40, мдэээ...
Александр
Уровень 102
Expert
14 ноября 2024, 04:40
Мне кажется, лучше просто пройти сюда https://spring.io/projects/spring-framework#learn или в любую другую документацию из проектов Spring.
Андрей
Уровень 109
30 августа 2024, 11:40
Кому непонятно, вот пересказ статьи в стиле вредных советов Григория Остера: Если хочешь ты настроить Контейнер для Spring'а свой, Помни, файлы XML Тут уместны, братец мой. Ты не бойся, не стесняйся Файл конфигураций брать, И из разных уголков Все ресурсы подключать. Groovy если вдруг припомнишь, То не бойся, не дрожи — Можешь бины ты создать, Только код свой напиши. А еще полезно будет Импортировать бины, Только, братец, постарайся Не использовать слеши. Вот советы тебе, друг, Как конфиг тебе создать, Чтобы Spring твой, словно часик, Начал правильно тикать!
Anonymous #3268884
Уровень 24
7 июня 2024, 23:13
Интересно, сколько уже человек пытались читать этот текст, и в итоге решили, что они тупые? ))) А сколько человек пытались убедить самих себя, что кое-что поняли? ))))) Даю подсказку: из этого текста понять вообще ничего нельзя, потому что это перевод с английского, сделанный то ли гугл-транслейтом, то ли яндекс-переводчиком, и в ходе перевода где-то примерно полностью потерялся смысл. Отсюда возникает впечатление, что тут все слишком заумно написано, но прикол в том, что текст вообще не имеет смысла. Это шутка типа такая)) Вот например, в статье написано: "Элемент property name ссылается на имя свойства JavaBean, а элемент ref ссылается на имя другого определения бина... " бла-бла-бла и так далее. Что этот набор слов должен означать? Ну во-первых, элемент property name ссылается вовсе не на "имя свойства JavaBean", а на имя поля в бине. Во-вторых, элемент ref ссылается не на какое-то там "имя другого определения бина", а попросту на id другого бина. То есть перевод уничтожил в этом тексте любой смысл. Что такое "файл определения"? Догадаетесь, что имелся в виду конфиг-файл? ))) А вот это вообще шикарно: "Можно использовать конструктор контекста приложения для загрузки определений бинов". Наверное имеется в виду, что в файле аппликэйшен-контекст можно использовать тег <constructor> для загрузки бинов по их id. Ну и само название статьи тоже глубокомысленное: "Создание экземпляра IoC-контейнера" Создание экземпляра в IoC-контейнере в общем-то. К чему я это все? Да к тому, что не надо пытаться эти статьи понять. Они здесь не для понимания, а для того, чтобы поржать над комментариями))
AlexJavaCore
Уровень 19
9 июля 2023, 10:16
Жаль что задач нет, просто теорию читаю не очень эффективно
чеснокКибер-Спортсмен в Counter-Strike 2
13 мая 2023, 22:21
тут чисто писанина? задач не будет?
Саша И.
Уровень 101
Expert
7 мая 2023, 04:48
Качество лекций по Спрингу - адок :) Слишком много понятий используется без пояснений, структура прыгает от рассказа сверху вниз к снизу вверх - воспринимать это трудно. Если бы не лекции менторов на курсе, не понял бы здесь вообще ничего.
BlackGrizzli Team
Уровень 46
22 марта 2023, 18:31
Понятно все с курсом, начал тут книгу читать, так и продолжу думаю. Там Spring куда понятнее описан. А коль и тут и там нет должной практики я ничего не теряю, но в книге даже примеры понятнее
Anonymous #3322198
Уровень 26
29 ноября 2023, 08:50
что за книга? подскажите, пожалуйста
Filand Gor
Уровень 34
13 февраля 2023, 21:12
надо хотя бы структуру проекта на спринге показать
Людмила Соболева
Уровень 108
Expert
18 декабря 2023, 16:12