Если вы изучаете Spring Framework и только начинаете свое путешествие по фреймворку, предварительное понимание некоторых концепций облегчит ваш путь. В этой статье мы поговорим о внедрении зависимостей (DI).

В двух словах, внедрение зависимостей (DI) — это программный шаблон, целью которого является уменьшение связи между частями системы. В результате у нас также есть более удобный и тестируемый код.

Контейнер Spring лежит в основе Spring Framework. Контейнер создает, подключает, настраивает и управляет объектами Java. Эти объекты Java в контексте Spring называются бинами. Контейнер использует DI для управления этими bean-компонентами, составляющими приложение.

Часто при написании кода на Java для создания экземпляров используется слово новый. Используя DI, мы избегаем слова новый, а зависимости внедряются контейнером. Посмотрите на код ниже.

public interface Animal {
    String makeNoise();
}
public class Cat implements Animal {
    @Override
    public String makeNoise() {
        return "Meowwww";
    }
}
public class ClientForAnimal {
    private Animal animal;
    public ClientForAnimal() {
        this.animal = new Cat();
    }
    public void askForAnimal() {
        a.makeNoise();
    }
}

В приведенном выше примере нам нужно управлять созданием объекта. Во втором примере контейнер Spring управляет объектом и внедряет его с помощью аннотации @Autowired. Посмотрите на код ниже.

@Component
public class Cat implements Animal {
    @Override
    public String makeNoise() {
        return "Meowwww";
    }
}
...
@Component
public class ClientForAnimal {
    private Animal animal;

    @Autowired //In this case @Autowired is not mandatory
    public ClientForAnimal(Animal animal) {
        this.animal = animal;
    }
   
    public void askForAnimal() {
        a.makeNoise();
    }
}

Поскольку у нас есть только один конструктор в нашем классе ClientForAnimal, мы могли бы опустить аннотацию @Autowired.

Как видите, у нас есть только класс Cat, реализующий интерфейс Animal, в этом случае двусмысленности нет, и Spring внедряет правильный экземпляр. Если бы у нас было два типа Animal, мы могли бы использовать аннотацию @Qualifier, чтобы избежать двусмысленности, поскольку контейнер Spring не знал бы, какой тип будет внедрен.

Посмотрите https://github.com/fthiagomedeiros/articles, чтобы ознакомиться с проектом. В папке dependencyinjection находится полный проект.

Введите mvn spring-boot:run через командную строку, и проект запустится с помощью maven.

В браузере введите http://localhost:8080/testdi