[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-patterny-chto-takoe-dependency-injection":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":16,"progress":17,"seo":18},1269,"chto-takoe-dependency-injection",40,"patterny","Паттерны","🧩","Что такое Dependency Injection?","Dependency Injection (DI) -- паттерн, при котором объект получает свои зависимости извне, а не создаёт их сам. Реализует принцип Dependency Inversion (D из SOLID).\n\n> Аналогия из жизни: DI -- как заказ еды в ресторане. Вы не идёте на кухню сами (не создаёте зависимости), а официант (контейнер) приносит вам блюдо (зависимость) за столик.\n\n```java\n\u002F\u002F БЕЗ DI -- жёсткая связность\nclass OrderService {\n    private final OrderRepository repo = new PostgresOrderRepository(); \u002F\u002F жёсткая связь\n    private final EmailService email = new SmtpEmailService();          \u002F\u002F жёсткая связь\n}\n\n\u002F\u002F С DI -- слабая связность\nclass OrderService {\n    private final OrderRepository repo;\n    private final EmailService email;\n\n    \u002F\u002F Зависимости внедряются через конструктор (рекомендуемый способ)\n    OrderService(OrderRepository repo, EmailService email) {\n        this.repo = repo;\n        this.email = email;\n    }\n}\n```\n\n### Три способа внедрения в Spring\n\n| Способ | Рекомендуется | Поля final | Тестируемость | Пример |\n|--------|:------------:|:----------:|:-------------:|--------|\n| Конструктор | Да | Да | Легко (`new Service(mock)`) | `OrderService(OrderRepository repo)` |\n| Сеттер | Иногда | Нет | Средне | `@Autowired void setRepo(...)` |\n| Поле | Нет | Нет | Только через reflection | `@Autowired private OrderRepository repo` |\n\n\u003Cdetails>\n\u003Csummary>Примеры трёх способов\u003C\u002Fsummary>\n\n```java\n\u002F\u002F 1. Через конструктор (РЕКОМЕНДУЕТСЯ)\n@Service\nclass OrderService {\n    private final OrderRepository repo;\n    OrderService(OrderRepository repo) { this.repo = repo; }\n}\n\n\u002F\u002F 2. Через сеттер\n@Service\nclass OrderService {\n    private OrderRepository repo;\n    @Autowired\n    void setRepo(OrderRepository repo) { this.repo = repo; }\n}\n\n\u002F\u002F 3. Через поле (НЕ РЕКОМЕНДУЕТСЯ -- затрудняет тестирование)\n@Service\nclass OrderService {\n    @Autowired\n    private OrderRepository repo;\n}\n```\n\n\u003C\u002Fdetails>\n\n### Важное\n\n- DI = реализация Dependency Inversion Principle (D из SOLID)\n- Конструктор -- лучший способ: поля final, объект полностью инициализирован, легко тестировать\n- IoC-контейнер (Spring) -- автоматизирует DI, управляя созданием и связыванием объектов\n\n### Частые ошибки\n\n- Field injection -- невозможно создать объект без рефлексии; `new OrderService()` не скомпилируется\n- Циклические зависимости -- A зависит от B, B от A; признак плохого дизайна\n- `new` внутри сервиса для зависимостей -- нарушает DI; используйте фабрику или Provider\n\n### Как используется в 2026\n\n- Spring IoC -- стандартный DI-контейнер в Java-экосистеме\n- Constructor injection -- единственный рекомендуемый способ\n\n> **На собеседовании:** объясните разницу между DI и IoC (DI -- конкретный паттерн, IoC -- общий принцип, DI -- один из способов реализации IoC). Частая ошибка -- использовать field injection в примерах и не знать, почему constructor injection лучше.","","junior",[15],"patterns",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Что такое Dependency Injection? — Gymterview","Dependency Injection (DI) -- паттерн, при котором объект получает свои зависимости извне, а не создаёт их сам. Реализует принцип Dependency Inversion (D из SOLI","Dependency Injection (DI) -- паттерн, при котором объект получает свои зависимости извне, а не создаёт их сам. Реализует",[15,13],"Dependency Injection (DI) -- паттерн, при котором объект получает свои зависимости извне, а не создаёт их сам. Реализует принцип Dependency Inversion (D из SOLID).",true]