@Autowired
Считается, что аннотации знакомы каждому разработчику Spring! в ДДБазовое руководство по Spring BootиБазовое руководство по Spring Cloudчасто появляются в .
Но когда мы используем IDEA для написания кода, мы часто обнаруживаем, что@Autowired
Под аннотацией есть небольшая желтая линия, наводим на нее маленькую мышку и видим предупреждающее сообщение, как показано на следующем рисунке:
Так почему IDEA даетField injection is not recommended
Как быть с таким предупреждением?
Задав этот вопрос, давайте всесторонне разберемся в трех методах внедрения в Spring, а также в их преимуществах и недостатках в различных аспектах.
Три способа внедрения зависимостей в Spring
Field Injection
@Autowired
Основным вариантом использования аннотаций являетсяField Injection
.
Конкретная форма выглядит следующим образом:
@Controller
public class UserController {
@Autowired
private UserService userService;
}
Этот метод внедрения реализуется через механизм отражения Java, поэтому частные члены также могут быть внедрены в определенные объекты.
Constructor Injection
Constructor Injection
Инъекция конструктора — наиболее рекомендуемый способ ежедневного использования.
Конкретная форма выглядит следующим образом:
@Controller
public class UserController {
private final UserService userService;
public UserController(UserService userService){
this.userService = userService;
}
}
Этот метод внедрения является очень прямым. Отношения устанавливаются при построении объекта, поэтому у этого метода есть требования к порядку, в котором создаются объекты. Конечно, Spring будет обрабатывать этот порядок за вас, если у вас нет циклической зависимости, тогда он будет бросать ненормально.
Setter Injection
Setter Injection
также использовать@Autowired
Аннотация, но используется так же, какField Injection
разные,Field Injection
используется для переменных-членов иSetter Injection
Когда он используется в функции Setter переменной-члена.
Конкретная форма выглядит следующим образом:
@Controller
public class UserController {
private UserService userService;
@Autowired
public void setUserService(UserService userService){
this.userService = userService;
}
}
Этот метод внедрения также хорошо понятен, он заключается во внедрении зависимого объекта, который вы хотите использовать, путем вызова метода set переменной-члена.
Сравнение трех типов внедрения зависимостей
Узнав о трех методах внедрения зависимостей, предоставляемых Spring, мы продолжаем возвращаться к вопросу, упомянутому в начале этой статьи: почему IDEA не рекомендуетсяField Injection
Шерстяная ткань?
Мы можем сравнить их плюсы и минусы с точки зрения нескольких тестов разработки:
надежность
Судя по процессу строительства объекта и процессу использования, является ли использование объекта на каждом этапе надежным:
-
Field Injection
: ненадежный -
Constructor Injection
:надежный -
Setter Injection
: ненадежный
Поскольку конструкторы имеют строгий порядок сборки и неизменяемость, они доступны после сборки и не могут быть изменены.
ремонтопригодность
В основном это оценивается с точки зрения более легкого чтения и анализа зависимостей:
-
Field Injection
:Разница -
Constructor Injection
:хорошо -
Setter Injection
:Разница
Или, поскольку ключ зависимости ясен, отношение зависимости можно проанализировать из конструктора, что более удобно для того, как мы понимаем и поддерживаем отношение.
Тестируемость
В случае сложных зависимостей проверьте, не проще ли в программе написать модульные тесты, чтобы судить
-
Field Injection
:Разница -
Constructor Injection
:хорошо -
Setter Injection
:хорошо
Constructor Injection
иSetter Injection
Так проще имитировать и внедрять объекты, поэтому легче реализовать модульное тестирование.
гибкость
В основном это оценивается по гибкости кодирования во время разработки и внедрения:
-
Field Injection
: очень гибкий -
Constructor Injection
: не гибкий -
Setter Injection
: очень гибкий
так какConstructor Injection
Существуют строгие требования к порядку проектирования зависимостей bean-компонентов, поэтому этот метод внедрения не очень гибкий. НапротивField Injection
иSetter Injection
Она очень гибкая, но и вносит в ситуацию хаос из-за гибкости, которая тоже палка о двух концах.
Обнаружение циклических отношений
Возможность определить, существует ли циклическая зависимость между bean-компонентами:
-
Field Injection
: не обнаружить -
Constructor Injection
:автоматическое обнаружение -
Setter Injection
: не обнаружить
представление
Различные методы впрыска, влияние на производительность
-
Field Injection
: начать быстро -
Constructor Injection
: медленный запуск -
Setter Injection
: начать быстро
Основное влияние оказывает время запуска, т.к.Constructor Injection
Существуют строгие требования к последовательности, поэтому время запуска будет увеличено.
Следовательно, совмещая вышеуказанные аспекты сравнения, можно получить следующую таблицу:
Результат очевиден,Constructor Injection
Он превосходит два других метода во многих аспектах, поэтомуConstructor Injection
Обычно первый выбор!
иSetter Injection
по сравнению сField Injection
По большей части это то же самое, но поскольку тестируемость лучше, когда вы используете@Autowired
, рекомендуется использоватьSetter Injection
образом, поэтому IDEA не выдаст предупреждение. В то же время это также отражает важность тестируемости!
Суммировать
Напоследок, к сегодняшнему обсуждению, для вашего удобства приведем два вывода:
- Об использовании внедрения зависимостей,
Constructor Injection
является предпочтительным. - использовать
@Autowired
При аннотации используйтеSetter Injection
Таким образом, код легче писать модульные тесты.
Что ж, сегодняшнее обучение здесь! Если вы столкнулись с трудностями в процессе обучения? может присоединиться к нашему супер высокому качествуГруппа весеннего технического обмена, участвовать в обменах и обсуждениях, лучше учиться и прогрессировать!
Оригинальность - это непросто, добро пожаловать, чтобы поделиться содержанием этой статьи, ваша поддержка - движущая сила для меня, чтобы продолжать!
Приглашаю обратить внимание на мой публичный номер: Программист ДД, поделитесь галантереей и мыслями, которых не видно снаружи!