Внедрение зависимостей – подход, при котором одни объекты декларативно определяют свои зависимости от других объектов. При данном подходе зависимости не создаются вручную, а предоставляются контейнером. Есть два подхода к внедрению зависимостей – через конструктор и через свойства. Сначала рассмотрим внедрение через свойства.
Добавляем spring-context в проект:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>LATEST</version> </dependency>
Структура проекта:
Создаем классы бинов.
package ru.mydesignstudio.spring.core.ioc.beans; public class DependentBean { private final int someValue; public DependentBean(int someValue) { this.someValue = someValue; System.out.println("DependentBean constructor"); } }
Очень простой класс, для его создания необходимо определить значение свойства someValue
в конструкторе.
package ru.mydesignstudio.spring.core.ioc.beans; public class MainBean { private final DependentBean dependentBean; public MainBean(DependentBean dependentBean) { this.dependentBean = dependentBean; System.out.println("MainBean constructor"); } }
Для создания экземпляра этого класса уже необходимо получить экземпляр класса DependentBean
и передать его в конструктор.
Описание контекста имеет вид:
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="dependentBean" class="ru.mydesignstudio.spring.core.ioc.beans.DependentBean"> <constructor-arg name="someValue" value="2" /> </bean> <bean id="mainBean" class="ru.mydesignstudio.spring.core.ioc.beans.MainBean"> <constructor-arg ref="dependentBean"/> </bean> </beans>
Рассмотрим по отдельности описание каждого бина.
<bean id="dependentBean" class="ru.mydesignstudio.spring.core.ioc.beans.DependentBean"> <constructor-arg name="someValue" value="2" /> </bean>
Здесь с помощью constructor-arg
определяется значение параметра конструктора. Как видим, указано непосредственное значение.
<bean id="mainBean" class="ru.mydesignstudio.spring.core.ioc.beans.MainBean"> <constructor-arg ref="dependentBean"/> </bean>
Здесь же с помощью того же параметра constructor-arg
уже указана ссылка на другой бин.
Получим бин MainBean
из контекста и посмотрим на его свойства:
package ru.mydesignstudio.spring.core.ioc; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import ru.mydesignstudio.spring.core.ioc.beans.MainBean; public class Application { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("common.xml"); MainBean bean = context.getBean(MainBean.class); } }
Свойства просмотрим в дебаггере. Как видим, внедрение зависимостей удалось.