Когда следует использовать различные методы инъекций зависимостей?

#spring #spring-boot

Вопрос:

Я новичок в spring Boot и пытался изучить различия между различными методами внедрения зависимостей. Существует ли какой-либо сценарий, в котором внедрение зависимостей через поле всегда предпочтительнее, чем внедрение конструктора или установщика? Я читал, что полевая инъекция-всегда плохая практика. Если это плохо, то почему мы все еще это делаем?

Комментарии:

1. Может быть, это уже ответ на ваш вопрос: почему инъекция поля-это зло

Ответ №1:

Короткий ответ: об этом нет никакой информации.

Длинный ответ:

Странно, что в документах spring даже не упоминается о полевой инъекции

DI существует в двух основных вариантах: внедрение зависимостей на основе конструктора и внедрение зависимостей на основе установщика.

Я не нашел никакой информации о том, когда внедрение полей предпочтительнее двух вышеупомянутых, кроме времени, когда вам не нужны какие-либо преимущества CBDI и SBDI(например, более простое тестирование и предотвращение NPE), и вы хотите сократить свой код, но даже этот аргумент устаревает, если вы используете Ломбок. Почему эта функция вообще существует в первую очередь, ИМХО:

1.Был неудачный выбор дизайна, который привел к его созданию и использованию в производстве(первая версия Spring Framework была опубликована еще в 2002 году, и, вероятно, в то время не было никаких споров о том, является ли внедрение в поле плохой практикой или нет)

2.Обратная совместимость остановлена из-за удаления этой функции, поскольку она может нарушить уже существующую кодовую базу.

Комментарии:

1. В 2002 году не было такого понятия, как инъекция поля, была только инъекция на основе конструктора или свойства y. (Тогда никаких аннотаций не было).

2. @M. Deinum не могли бы вы объяснить, пожалуйста, почему эта функция вообще существует? Я больше не могу спать, не думая об этом вопросе. У тебя, кажется, гораздо больше опыта

3. Для выбора дизайна вам придется обратиться к разработчикам фреймворка, но факт в том, что и CDI, и внедрение ресурсов из Java/JEE имеют одинаковые функции. Это существует потому, что это легко сделать, но это не значит, что это правильно.