Внедрение зависимостей через конструктор

Внедрение зависимостей – подход, при котором одни объекты декларативно определяют свои зависимости от других объектов. При данном подходе зависимости не создаются вручную, а предоставляются контейнером. Есть два подхода к внедрению зависимостей – через конструктор и через свойства. Сначала рассмотрим внедрение через свойства.

Добавляем 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);
    }
}

Свойства просмотрим в дебаггере. Как видим, внедрение зависимостей удалось.