Есть три основных вида:
Внедрение через поле (Field Injection): Зависимость внедряется напрямую в поле класса с помощью аннотации (например, @Autowired в Spring). Простой в использовании, но затрудняет модульное тестирование и нарушает принцип единой ответственности, скрывая зависимости.
java
Внедрение через сеттер (Setter Injection): Зависимость внедряется через публичный метод-сеттер. Позволяет опционально иметь зависимость (необязательно устанавливать), удобно для изменения зависимостей во время выполнения (хотя и редко используется). Не создает обязательную зависимость при создании объекта.
java
Внедрение через конструктор (Constructor Injection): Зависимость внедряется через аргумент конструктора. Является предпочтительным, так как обеспечивает обязательность зависимости (без нее объект не может быть создан), упрощает модульное тестирование (легко передать мок-объекты) и ясно декларирует потребности класса. Делает объекты неизменяемыми после создания, если поля final.
java
Сравнительная таблица:
| Вид внедрения | Обязательность зависимости | Простота использования | Тестируемость | Неизменяемость |
|---|---|---|---|---|
| Через поле | Опционально (скрыто) | Высокая | Низкая | Нет |
| Через сеттер | Опционально | Средняя | Средняя | Нет |
| Через конструктор | Обязательно | Средняя | Высокая | Возможна |
В большинстве случаев рекомендуется использовать внедрение через конструктор.