Я читал в некоторых сообщениях о Spring MVC и портлетах, что внедрение полей не рекомендуется. Насколько я понимаю, инъекция поля - это когда вы вводите Bean @Autowired
следующим образом:
@Component
public class MyComponent {
@Autowired
private Cart cart;
}
Во время своего исследования я также читал о внедрении конструктора :
@Component
public class MyComponent {
private final Cart cart;
@Autowired
public MyComponent(Cart cart){
this.cart = cart;
}
}
Каковы преимущества и недостатки обоих этих типов инъекций?
РЕДАКТИРОВАТЬ 1: Поскольку этот вопрос отмечен как дубликат этого вопроса, я проверил его. Потому что нет примеров кода ни в вопросе, ни в ответах, мне непонятно, правильно ли я догадываюсь, какой тип инъекции я использую.
Date(int,int,int)
существует.Ответы:
Типы инъекций
Существует три варианта внедрения зависимостей в bean-компонент:
Вы используете вариант 3. Это то, что происходит, когда вы используете его
@Autowired
прямо на своем поле.Инъекции
Общие рекомендации, рекомендованные Spring (см. Разделы, посвященные DI на основе конструктора или DI на основе Setter ), следующие:
Недостатки полевого ввода
Причины, по которым инъекция поля не одобряется, заключаются в следующем:
Вывод
В зависимости от ваших потребностей вы должны в первую очередь использовать инъекцию конструктора или некоторое сочетание инъекции конструктора и установщика. Полевая инъекция имеет много недостатков, и ее следует избегать. Единственное преимущество инъекции поля в том, что его удобнее писать, что не перевешивает всех минусов.
дальнейшее чтение
Я написал в блоге статью о том, почему внедрение поля обычно не рекомендуется: Внедрение зависимости поля считается вредным .
источник
Это одна из бесконечных дискуссий в разработке программного обеспечения, но основные влиятельные лица в отрасли становятся все более самоуверенными по поводу этой темы и начали предлагать внедрение конструктора как лучший вариант.
Внедрение конструктора
Плюсы:
Минусы:
В основном, закачка поля происходит наоборот.
источник
Дело вкуса. Это твое решение.
Но я могу объяснить, почему я никогда не использую внедрение конструктора .
Я не хочу , чтобы реализовать конструктор для всех моих
@Service
,@Repository
и@Controller
бобов. Я имею в виду, что есть около 40-50 зерен или больше. Каждый раз, если я добавляю новое поле, мне приходилось расширять конструктор. Нет, я этого не хочу и не обязана.Что делать, если вашему бину (службе или контроллеру) требуется внедрить много других бинов? Конструктор с 4+ параметрами очень уродлив.
Если я использую CDI, конструктор меня не касается.
РЕДАКТИРОВАТЬ # 1 : Войтех Ружичка сказал:
Да. Теория и реальность. Вот пример:
DashboardController
сопоставлен с одним путем*:8080/dashboard
.мой
DashboardController
собирает много информации от других служб, чтобы отображать их на странице обзора панели / системы. Мне нужен этот единственный контроллер. Поэтому я должен защитить только этот единственный путь (базовый фильтр аутентификации или роли пользователя).РЕДАКТИРОВАТЬ # 2 : Поскольку все сосредоточены на 8 параметрах в конструкторе ... Это был реальный пример - унаследованный код клиентов. Я это изменил. Та же аргументация применима ко мне для 4+ параметров.
Все дело в внедрении кода, а не в создании экземпляра.
источник
Еще один комментарий - Войтех Ружичка заявил, что Spring вводит beans тремя способами (ответ с наибольшим количеством баллов):
Этот ответ НЕПРАВИЛЬНЫЙ - потому что ДЛЯ КАЖДОГО ВИДА ИНЪЕКЦИОННОЙ ПРУЖИНЫ ИСПОЛЬЗУЕТ ОТРАЖЕНИЕ! Используйте IDE, установите точку останова в установщике / конструкторе и проверьте.
Это может быть делом вкуса, но также может быть делом СЛУЧАЯ. @dieter предоставил отличный случай, когда инъекция поля лучше. Если вы используете внедрение поля в интеграционных тестах, которые настраивают контекст Spring - аргумент с тестируемостью класса также недействителен - если только вы не хотите писать позже тесты в свои интеграционные тесты;)
источник