В чем разница между @Inject и @Autowired в Spring Framework?Какой использовать при каких условиях? - PullRequest
634 голосов
/ 22 августа 2011

Я просматриваю некоторые блоги на SpringSource и в одном из блогов, автор использует @Inject, и я полагаю, что он также может использовать @Autowired.

Вот фрагмент кода:

@Inject private CustomerOrderService customerOrderService;

Я не уверен в разнице между @Inject и @Autowired и был бы признателен, если бы кто-то объяснил их разницу и какой использовать в какой ситуации?

Ответы [ 10 ]

666 голосов
/ 22 августа 2011

Предполагая, что здесь вы имеете в виду аннотации javax.inject.Inject.@Inject является частью стандарта Java CDI ( Контексты и внедрение зависимостей ), представленного в Java EE 6 (JSR-299), подробнее .Spring решил использовать @Inject в качестве синонима с собственной аннотацией @Autowired.

Итак, чтобы ответить на ваш вопрос, @Autowired - собственная (устаревшая) аннотация Spring.@Inject является частью новой технологии Java под названием CDI, которая определяет стандарт для внедрения зависимостей, подобный Spring.В приложении Spring две аннотации работают так же, как Spring решил поддержать некоторые аннотации JSR-299 в дополнение к их собственной.

151 голосов
/ 22 августа 2011

Вот сообщение в блоге , в котором сравниваются @Resource, @Inject и @Autowired, и которое, кажется, выполняет довольно сложную работу.

По ссылке:

За исключением теста 2 и 7, конфигурация и результаты были идентичны.Когда я заглянул под капот, я определил, что аннотации @Autowired и @Inject ведут себя одинаково.Обе эти аннотации используют AutowiredAnnotationBeanPostProcessor для внедрения зависимостей.«@Autowired» и «@Inject» можно использовать взаимозаменяемо для внедрения компонентов Spring.Однако аннотация @Resource использует CommonAnnotationBeanPostProcessor для внедрения зависимостей.Несмотря на то, что они используют разные классы постпроцессора, они ведут себя почти одинаково.Ниже приведена сводная информация об их путях выполнения.

В тестах 2 и 7 указывается, что автор ссылается на «внедрение по имени поля» и «попытку разрешения компонента с использованием неверного квалификатора», соответственно.

Заключение должно предоставить вам всю необходимую информацию.

32 голосов
/ 25 января 2012

Чтобы справиться с ситуацией, когда проводка отсутствует, бины доступны с атрибутом @Autowired required, установленным на false.

Но при использовании @Inject интерфейс поставщика работает сbean, что означает, что bean вводится не напрямую, а через провайдера.

24 голосов
/ 17 июля 2013

Начиная с Spring 3.0, Spring предлагает поддержку аннотаций внедрения зависимостей JSR-330 (@Inject, @Named, @Singleton).

В документации Spring есть отдельный раздел о них, включая сравнения с их весенними эквивалентами.

21 голосов
/ 17 ноября 2015

Ключевая разница (замеченная при чтении Spring Docs ) между @Autowired и @Inject заключается в том, что @Autowired имеет атрибут 'required', в то время как @Inject не имеет атрибут 'required' .

14 голосов
/ 26 ноября 2015

Лучше использовать @Inject все время. Потому что именно подход к настройке Java (предоставляемый Sun) делает наше приложение независимым от фреймворка. Так что, если вы весной, ваши занятия будут работать.

Если вы используете @Autowired, он будет работать только с пружиной, поскольку @Autowired - это аннотация, предоставляемая пружиной.

12 голосов
/ 08 октября 2015

@Autowired аннотация определена в среде Spring.

@Inject аннотация - это стандартная аннотация, которая определена в стандарте «Внедрение зависимостей для Java» (JSR-330) .Spring (начиная с версии 3.0) поддерживает обобщенную модель внедрения зависимостей, которая определена в стандарте JSR-330.( Каркасы Google Guice и Каркас Picocontainer также поддерживают эту модель).

С помощью @Inject можно вставить ссылку на реализацию интерфейса Provider,что позволяет вводить отложенные ссылки.

Аннотации @Inject и @Autowired - это практически полные аналогии.Как и аннотация @Autowired, аннотация @Inject может использоваться для свойств, методов и конструкторов автоматического связывания.

В отличие от аннотации @Autowired, аннотация @Inject не имеет атрибута required.Поэтому, если зависимости не будут найдены - будет сгенерировано исключение.

Существуют также различия в пояснениях свойств привязки.Если в выборе компонентов для впрыска есть неопределенность, следует добавить классификатор @Named.В аналогичной ситуации для аннотации @Autowired будет добавлен квалификатор @Qualifier (JSR-330 определяет свою собственную аннотацию @Qualifier и с помощью этой аннотации определителя определяется @Named).

12 голосов
/ 19 августа 2014

@Inject не имеет атрибута 'required'

9 голосов
/ 22 июня 2015

В дополнение к вышесказанному:

  1. Область по умолчанию для @Autowired bean-компонентов - Singleton, тогда как при использовании аннотации @SRject JSR 330 она похожа на Spring * prototype.
  2. .нет эквивалента @Lazy в JSR 330 с использованием @ Inject
  3. Нет эквивалента @Value в JSR 330 с использованием @ Inject
0 голосов
/ 11 апреля 2018

Аннотация @Inject является одной из коллекции аннотаций JSR-330. Это имеет соответствие по типу, соответствие по классификатору, соответствие по имени пути выполнения. Эти пути выполнения действительны как для установки, так и для введения поля. Поведение аннотации @Autowired такое же, как и аннотации @Inject. Единственное отличие состоит в том, что аннотация @Autowired является частью среды Spring. @Autowired аннотация также имеет вышеуказанные пути выполнения. Поэтому я рекомендую @Autowired для вашего ответа.

...