Почему IDEA не рекомендует использовать @Autowired?

Java

@AutowiredСчитается, что аннотации знакомы каждому разработчику Spring! в ДДБазовое руководство по Spring BootиБазовое руководство по Spring Cloudчасто появляются в .

Но когда мы используем IDEA для написания кода, мы часто обнаруживаем, что@AutowiredПод аннотацией есть небольшая желтая линия, наводим на нее маленькую мышку и видим предупреждающее сообщение, как показано на следующем рисунке:

IDEA警告:Field injection is not recommended

Так почему 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 не выдаст предупреждение. В то же время это также отражает важность тестируемости!

Суммировать

Напоследок, к сегодняшнему обсуждению, для вашего удобства приведем два вывода:

  1. Об использовании внедрения зависимостей,Constructor Injectionявляется предпочтительным.
  2. использовать@AutowiredПри аннотации используйтеSetter InjectionТаким образом, код легче писать модульные тесты.

Что ж, сегодняшнее обучение здесь! Если вы столкнулись с трудностями в процессе обучения? может присоединиться к нашему супер высокому качествуГруппа весеннего технического обмена, участвовать в обменах и обсуждениях, лучше учиться и прогрессировать!

Оригинальность - это непросто, добро пожаловать, чтобы поделиться содержанием этой статьи, ваша поддержка - движущая сила для меня, чтобы продолжать!

Приглашаю обратить внимание на мой публичный номер: Программист ДД, поделитесь галантереей и мыслями, которых не видно снаружи!

Категории