Инверсия контроля и Внедрение зависимостей (IoC и DI)?
Инверсия контроля (она же инверсия управления или inversion of control) подразумевает ослабление связей между объектами в программе и передачу управления потоком выполнения фреймворку.
Ослабления связей между объектами
Существует два класса: Person (человек) и Dress (платье). Человеку нужно носить одежду и мы можем дать ему платье следующим образом:
class Person { private Dress clothes = new Dress(); }
Вроде всё получилось, но теперь этот человек может носить только платья. А если ему придётся надеть что-то другое?
Это сильная зависимость. И её можно ослабить, написав интерфейс:
interface Clothes { //какие-то методы одежды }
Далее, классом Dress реализовать данный интерфейс:
class Dress implements Clothes { //какие-то поля платья }
И заменить класс Dress у поля Person на интерфейс Clothes:
class Person { private Clothes clothes = new Dress(); }
Теперь, если мы захотим одеть человека во что-нибудь другое, мы можем написать новый класс, скажем, для костюма, реализовать им интерфейс одежды и просто передать человеку:
class Suit implements Clothes { //какие-то поля костюма }
class Person { private Clothes clothes = new Suit(); }
Отлично, теперь наш код стал гибче, но осталось исправить ещё одну вещь.
Категорически не рекомендуется создавать необходимые объекты через new внутри других классов. Вместо этого надо принимать объекты извне. Для этого используются конструкторы или сеттеры.
class Person { private Clothes clothes; //конструктор public Person(Clothes clothes) { this.clothes = clothes; } //сеттер public void setClothes(Clothes clothes) { this.clothes = clothes; } }
И после этого объект Person можно будет создать в главном классе, который является точкой начала выполнения программы:
public class Main { public static void main(String[] args) { //создали человека в платье Person person = new Person(new Dress()); //переодели человека в костюм person.setClothes(new Suit()); } }
Передача объектов внутрь других объектов и называется Dependency Injection (внедрение зависимостей)
Передача управления фреймворкам
Без фреймворков программист сам решает что, где, и в какой последовательности работает. В ином случае, уже фреймворк решает, что и когда заработает в коде (чаще всего это реакции на действия пользователей web-приложений), а программист пишет код только там, где дозволено (в контроллерах, сервисах и пр.).
Ну вроде понятно.











