Типи ін'єкцій
Існує три варіанти того, як залежність можна вводити в зерно:
- Через конструктор
- За допомогою сетерів або інших методів
- Через рефлексію, безпосередньо в поля
Ви використовуєте варіант 3. Це те, що відбувається, коли ви використовуєте @Autowired
безпосередньо на своєму полі.
Настанови щодо ін'єкцій
Загальне керівництво, яке рекомендує Spring (див. Розділи на основі конструктора DI або DI на основі сеттера ), наступне:
- Для обов'язкових залежностей або для досягнення незмінності використовуйте ін'єкцію конструктора
- Для необов'язкових або змінних залежностей використовуйте ін'єкцію сетера
- У більшості випадків уникайте польових ін'єкцій
Недоліки в області впорскування
Причини, через які нагнітається польова ін'єкція, наступні:
- Ви не можете створити незмінні об'єкти, як це можливо при введенні конструктора
- Ваші класи мають щільне з'єднання з вашим контейнером DI, і його не можна використовувати поза ним
- Ваші класи не можуть бути екземплярами (наприклад, в одиничних тестах) без роздумів. Вам потрібен контейнер DI, щоб створити їх екземпляри, що робить ваші тести схожішими на тести інтеграції
- Ваші реальні залежності приховані від зовнішньої сторони і не відображаються у вашому інтерфейсі (або конструктори, або методи)
- Дійсно мати десять залежностей дуже просто. Якби ви використовували інжектор конструктора, у вас був би конструктор з десятьма аргументами, який би сигналізував про те, що щось є рибним. Але ви можете додавати введені поля, використовуючи ін'єкції поля нескінченно. Занадто велика кількість залежностей - це червоний прапор, що клас зазвичай робить більше, ніж один, і що він може порушувати єдиний принцип відповідальності.
Висновок
Залежно від ваших потреб, перш за все, ви повинні використовувати інжектор конструктора або якусь суміш впорскування конструктора та сетера. Польова інжекція має багато недоліків і цього слід уникати. Єдиною перевагою польового введення є те, що зручніше писати, що не переважує всіх мінусів.
Подальше читання
Я написав статтю в блозі про те, чому зазвичай не рекомендується вводити поле введення: Введення в залежність залежно від поля вважається шкідливим .