1. Что такое инверсия контроля (IoC) и внедрение зависимостей (DI)? Какони реализованы в Spring?
UNKNOWNИнверсия (от латинского inversio) - перестановка. Инверсия контроля (инверсия управления) — это принцип в разработке программного обеспечения, при котором управление объектами или частями программы передается контейнеру или фреймворку. Чаще всего этот принцип используется в контексте объектно-ориентированного программирования.
В отличие от традиционного программирования, в котором наш пользовательский код обращается напрямую к библиотекам, IoC позволяет фреймворку контролировать ход программы и обращаться к нашему коду, когда это необходимо. Для этого, фреймворки используют абстракции со встроенным дополнительным поведением. Если мы хотим добавить наше собственное поведение, нам нужно расширить классы фреймворка или подключить наши собственные классы.
Преимущества этой архитектуры:
- отделение выполнения задачи от ее реализации;
- легкое переключение между различными реализациями;
- большая модульность программы;
- более легкое тестирование программы путем изоляции компонента или проверки его зависимостей и обеспечения взаимодействия компонентов через контракты.
Инверсия управления может быть достигнута с помощью различных механизмов, таких как: шаблон проектирования “Стратегия”, шаблон “Локатор служб”, шаблон “Фабрика” и внедрение зависимостей (DI).
Dependency Injection (DI)
Внедрение зависимостей — это шаблон проектирования для реализации IoC, где инвертируемым (переопределяемым) элементом контроля является настройка зависимостей объекта.
Соединение объектов с другими объектами или «внедрение» объектов в другие объекты выполняется контейнером IoC, а не самими объектами.
В Spring Framework инверсия контроля достигается именно внедрением зависимостей. В Spring Framework инверсия контроля и внедрение зависимостей считаются одним и тем же.
В Spring Framework внедрение зависимостей описывается как процесс, посредством которого объекты определяют свои зависимости (то есть другие объекты, с которыми они работают) только через аргументы конструктора, аргументы фабричного метода (Шаблон проектирования “Фабричный метод” предлагает создавать объекты не напрямую, используя оператор new, а через вызов особого статического фабричного метода в классе. Объекты всё равно будут создаваться через оператор new, но делать это будет фабричный метод. Refactoring Guru - Фабричный метод) или свойства, которые устанавливаются в экземпляре объекта после того, как он создан или возвращен из метода фабрики. После чего контейнер IoC внедряет эти зависимости в компонент при его создании.
Мы можем создать зависимость объекта следующим традиционным способом, безиспользования принципа IoC:
public class Store {
private Item item;
public Store() {
item = new ItemImpl1();
}
}
В приведенном выше примере мы создаем экземпляр конкретной реализации интерфейса Item (ItemImpl1) внутри самого класса Store.
Используя DI, мы можем переписать пример без указания конкретной реализации Item, не создавая её внутри нашего объекта, а ожидая её получение извне (от внешнего фреймворка - контейнера IoC):
public class Store {
private Item item;
public Store(Item item) {
this.item = item;
}
}
В данном случае инверсия контроля — это переход контроля над зависимостями от объекта Store к контейнеру IoC. Объект Store более не контролирует инстанцирование своего поля (зависимости) item, не создаёт этот объект самостоятельно, а делегирует этот процесс внешним силам - контейнеру IoC, который в нашем примере передаёт в конструктор Store любую из реализаций Item.
Внедрение зависимостей в Spring Framework может быть сделано через конструкторы, сеттеры или поля.
Отдаем создание и управление объектами на аутсорс Spring-у.
Предыдущий вопрос: 38. Что такое Entity Graph? Как и для чего его использовать?
Следующий вопрос: 2. Что такое IoC Container?
Все вопросы по теме: список
Все темы: список
Вопросы/замечания/предложения/нашли ошибку: напишите мне