Если вы изучаете 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