Инъекции зависимостей

Что такое зависимость

Зависимость — это когда одна сущность не может работать без другой. Например, разработчик не может написать программу без компьютера.

Зависимость в программировании (dependency) означает, что один программный компонент не работает без другого. Например, класс «программист» — без класса «компьютер».

Пример. Представь холодильник. Когда его дверца открывается, внутри включается свет. Для этого в холодильнике есть лампочка. Если она не работает, свет в холодильнике не загорится. Получается, свет связан с лампочкой — это зависимость.

Этот пример легко переложить на язык Java. Пусть холодильнику в коде соответствует класс Fridge, а лампочке — HorizontLamp. Класс лампочки называется так, потому что её произвели на заводе «Горизонт».

В классе холодильника есть метод openDoor(). Он открывает дверцу. А класс лампочки содержит метод switchLightOn(), который включает свет.

Чтобы включить свет при открытии дверцы, нужно вызвать метод switchLightOn() для объекта HorizontLamp внутри класса Fridge:

public class HorizontLamp {
    // метод, который включает лампочку
    public void switchLightOn() {
        System.out.println("Лампочка загорелась");
    }
}

public class Fridge {
    // метод открывает двери
    public void openDoor() {
        // объект класса HorizontLamp
        HorizontLamp horizontLamp = new HorizontLamp();
        // включается свет
        horizontLamp.switchLightOn();

    }
}

Чтобы в одном классе использовать методы другого, нужно создать в нём объект этого другого класса. Чтобы «холодильник» включил свет, в методе openDoor() создали экземпляр «лампочки».

// создали объект класса HorizontLamp
HorizontLamp horizontLamp = new HorizontLamp();

Класс Fridge зависит от HorizontLamp, потому что не сможет без него работать. Поэтому класс Fridge называют зависимым, а класс HorizontLampзависимостью.

У кода с зависимостями есть недостатки. Представь: завод «Горизонт» нужно заменить на «СуперЛампочка». Объект класса HorizontLamp меняется на объект класса SuperLamp.

Ещё может произойти так, что конструктор класса HorizontLamp изменится. Например, у него появится параметр — мощность лампочки.

В обоих случаях нужно переписать код класса Fridge, ведь лампочка находится прямо в нём.

Что такое инъекция зависимостей

Инъекция зависимостей (англ. Dependency Injection, или DI) — это принцип построения кода.

В основе принципа лежит такая идея:

<aside> 💡 Когда ты создаёшь зависимость внутри зависимого объекта, появляются сложности. → Значит, нужно вынести создание зависимости из объекта в другое место. → Тогда зависимость можно будет внедрить в объект в готовом виде.

</aside>