[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-chto-takoe-ioc-i-di-v-chyom-raznitsa-mezhdu-nimi":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},606,"chto-takoe-ioc-i-di-v-chyom-raznitsa-mezhdu-nimi",14,"spring","Spring","🌱","Что такое IoC и DI? В чём разница между ними?","IoC (Inversion of Control) -- принцип проектирования, при котором управление созданием объектов и их жизненным циклом передаётся от самого приложения к фреймворку. DI (Dependency Injection) -- конкретный паттерн реализации IoC, при котором зависимости «внедряются» в объект контейнером извне.\n\nIoC -- это философия, DI -- способ её воплощения. DI -- наиболее распространённая форма IoC.\n\n### Без IoC\u002FDI (жёсткая связность)\n\n```java\npublic class OrderService {\n    \u002F\u002F OrderService сам создаёт свою зависимость -- жёсткая связь\n    private OrderRepository repository = new OrderRepositoryImpl();\n\n    public void createOrder(Order order) {\n        repository.save(order);\n    }\n}\n```\n\n### С IoC\u002FDI (слабая связность)\n\n```java\n@Service\npublic class OrderService {\n    private final OrderRepository repository;\n\n    \u002F\u002F Зависимость внедряется контейнером через конструктор\n    @Autowired\n    public OrderService(OrderRepository repository) {\n        this.repository = repository;\n    }\n\n    public void createOrder(Order order) {\n        repository.save(order);\n    }\n}\n```\n\n### Преимущества DI\n\n- Слабая связность -- классы зависят от интерфейсов, а не от конкретных реализаций\n- Тестируемость -- в тестах легко подставить мок вместо реальной зависимости\n- Гибкость -- можно менять реализации без изменения кода клиента\n- Единая точка конфигурации -- зависимости описаны в одном месте\n\n### Другие формы IoC (кроме DI)\n\n- Service Locator -- объект сам запрашивает зависимости у специального реестра\n- Template Method -- управление потоком передаётся родительскому классу\n- Event-driven -- управление через события\n\n> **На собеседовании:** ключевая мысль -- IoC это принцип, DI это реализация. Частая ошибка -- говорить, что IoC и DI это одно и то же.","","junior",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Что такое IoC и DI? В чём разница между ними? — Gymterview","IoC (Inversion of Control) -- принцип проектирования, при котором управление созданием объектов и их жизненным циклом передаётся от самого приложения к фреймвор","IoC (Inversion of Control) -- принцип проектирования, при котором управление созданием объектов и их жизненным циклом пе",[7,13],"IoC (Inversion of Control) -- принцип проектирования, при котором управление созданием объектов и их жизненным циклом передаётся от самого приложения к фреймворку. DI (Dependency Injection) -- конкретный паттерн реализации IoC, при котором зависимости «внедряются» в объект контейнером извне.",true]