Типы инъекций
Существует три варианта внедрения зависимостей в bean-компонент:
- Через конструктор
- Через сеттеры или другие методы
- Через отражение прямо в поля
Вы используете вариант 3. Это то, что происходит, когда вы используете его @Autowired
прямо на своем поле.
Инъекции
Общие рекомендации, рекомендованные Spring (см. Разделы, посвященные DI на основе конструктора или DI на основе Setter ), следующие:
- Для обязательных зависимостей или при стремлении к неизменности используйте внедрение конструктора
- Для дополнительных или изменяемых зависимостей используйте внедрение установщика
- В большинстве случаев избегайте полевых инъекций
Недостатки полевого ввода
Причины, по которым инъекция поля не одобряется, заключаются в следующем:
- Вы не можете создавать неизменяемые объекты, как при инъекции конструктора.
- Ваши классы тесно связаны с вашим контейнером DI и не могут использоваться вне его.
- Ваши классы не могут быть созданы (например, в модульных тестах) без отражения. Вам нужен контейнер DI для их создания, что делает ваши тесты более похожими на интеграционные.
- Ваши реальные зависимости скрыты извне и не отражаются в вашем интерфейсе (конструкторы или методы).
- Очень легко иметь десять зависимостей. Если бы вы использовали инъекцию конструктора, у вас был бы конструктор с десятью аргументами, которые сигнализировали бы о том, что что-то подозрительно. Но вы можете добавлять введенные поля с помощью инъекции полей на неопределенный срок. Наличие слишком большого количества зависимостей - это красный флаг, который указывает на то, что класс обычно выполняет несколько задач и может нарушить принцип единой ответственности.
Вывод
В зависимости от ваших потребностей вы должны в первую очередь использовать инъекцию конструктора или некоторое сочетание инъекции конструктора и установщика. Полевая инъекция имеет много недостатков, и ее следует избегать. Единственное преимущество инъекции поля в том, что его удобнее писать, что не перевешивает всех минусов.
дальнейшее чтение
Я написал в блоге статью о том, почему внедрение поля обычно не рекомендуется: Внедрение зависимости поля считается вредным .