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

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

Модуль 5. Spring
1 уровень , 2 лекция
Открыта

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