DI - паттерн (набор паттернов). Цель - создание слабосвязанного кода.
public class A {
public void func(){
System.out.println("Hello World");
}
}
public class B {
private A a;
public B(){
this.a = new A(); // полный контроль над созданием объекта типа A
}
public void useA(){
a.func(); // делегирование функционала другому объекту
}
}
Когда объект B создаёт внутри себя объект А, объект B:
Можно сказать, что объект B управляет объектом A. Суть паттерна DI заключается в том, что объект A создаётся за пределами объекта B. Связанность кода уменьшается:
Поскольку объекту B для делегирования части своего функционала нужна ссылка на объект A, эта ссылка передаётся в объект B через конструктор или свойство (метод сеттер). Ссылка на другой объект - это зависимость, передача в объект ссылки на другой объект - это внедрение зависимости (DI).
Паттерн DI не регламентирует, как именно создаются объекты. Объекты могут создаваться вручную (командой new) или с помощью специального объекта - контейнера DI. Наличие контейнера DI позволяет автоматизировать разрешение зависимостей (сопоставление объектов, необходимых для работы), что ещё больше уменьшает связанность кода.