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

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

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

@Inject private CustomerOrderService customerOrderService;

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


person Rachel    schedule 22.08.2011    source источник
comment
У меня нет ответа, так как я тоже новичок в этом, но это может помочь sakaenakajima.wordpress.com/2010/08/10/   -  person Sagar V    schedule 22.08.2011
comment
Дубликат: stackoverflow.com/questions/13657787/import-custom-java- класс   -  person RustyShackleford    schedule 28.01.2016
comment
Разница между '@Inject' и '@Autowired' хорошо объясняется в этой статье alextheedom.wordpress.com/2016/02/13/   -  person Alex Theedom    schedule 05.05.2016
comment
Взгляните на эту ссылку: cretepage.com/spring/ Эта функция поддерживается в @Inject автоматически без какого-либо атрибута (required = false)   -  person Ziaullhaq Savanur    schedule 18.06.2020


Ответы (11)


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

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

person pap    schedule 22.08.2011
comment
Итак, теоретически, если вы использовали @Inject, вы могли бы заменить spring другой структурой DI, например. Таким же образом выдумывайте и внедряйте свои зависимости. - person Alex Barnes; 25.01.2012
comment
Рискуя проявить педантичность: @Inject - это отдельный JSR (JSR-330) от CDI (JSR-299). - person Brad Cupit; 06.11.2013
comment
Если вы полагаетесь только на аннотации JSR- *, конечно, вы можете заменить свою структуру DI. Но ты будешь? После того, как вы начали использовать Spring, скорее всего, вы использовали его гораздо больше, чем просто DI. Вы не просто будете вносить изменения; и даже если вы это сделаете, это не несколько поисков и замен, которые сделают или сломают ход. С другой стороны, собственные аннотации Spring предлагают вам гораздо больше функциональных возможностей. Освоение хорошего фреймворка даст вам больше, чем использование многих из них. - person Agoston Horvath; 10.08.2015
comment
Я согласен с вами, что мы не часто меняем фреймворки DI. Однако, если в нашем исходном коде есть несколько пакетов, и если вы хотите создать общий пакет, который вы хотите использовать в нескольких проектах, а затем использовать аннотацию @Inject JSR, лучше, чем использовать @Autowired, который блокирует вашу базу кода с помощью Spring DI. - person Aditya; 26.02.2016
comment
Использование одного только @Inject не гарантирует независимости фреймворка. Вам также нужно будет объявить инъекционные bean-компоненты без механизмов, зависящих от фреймворка, таких как Spring @Component или application.xml, но использовать @Named и @Singleton на уровне класса. Понятия не имею, действительно ли какой-нибудь проект Spring объявляет такие бины сегодня - я даже никогда не слышал о каком-либо проекте, который мигрировал со Spring на JEE ... - person Marcus K.; 11.04.2018
comment
Взгляните на эту ссылку: cretepage.com/spring/ Эта функция поддерживается в @Inject автоматически без какого-либо атрибута (required = false) - person Ziaullhaq Savanur; 18.06.2020

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

По ссылке:

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

Тесты 2 и 7, на которые ссылается автор, являются «инъекцией по имени поля» и «попыткой разрешения bean-компонента с использованием плохого квалификатора» соответственно.

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

person nicholas.hauschild    schedule 22.08.2011
comment
Эта статья является прекрасным объяснением трех аннотаций. Пришлось перечитывать после первого свайпа; но, отличная статья. - person Thomas; 19.06.2015
comment
Большое спасибо! В статье даны ответы на несколько моих ответов в моем поиске различий и сходств между Spring и JavaEE, а также на несколько других вопросов, которые у меня возникли. - person Kevin Cruijssen; 18.11.2016
comment
Взгляните на эту ссылку: cretepage.com/spring/ Эта функция поддерживается в @Inject автоматически без какого-либо атрибута (required = false) - person Ziaullhaq Savanur; 18.06.2020

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

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

person amits    schedule 25.01.2012
comment
Это так важно, и это было упущено в ответах, получивших наибольшее количество голосов. - person Igor Donin; 20.01.2016
comment
По умолчанию для параметра Autowired установлено значение true. Ссылка: docs.spring.io/spring-framework/docs/current/javadoc-api/org/ - person tranquil; 07.03.2017

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

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

person Andre Steingress    schedule 17.07.2013
comment
Вопрос: что вы имеете в виду, когда говорите, что Spring поддерживает JSR? Разве контейнер не поддерживает JSR независимо от Spring и не требует ли он совместимости с J2EE? Вы имеете в виду, что он обертывает функциональность? Если бы Spring не поддерживал его, разве аннотация из javax не работала бы по умолчанию? - person Dan Chase; 08.07.2017
comment
Не обязательно запускать Spring в контейнере JEE, вы также можете использовать его в контейнере сервлета / JSP, таком как Tomcat, и по-прежнему иметь поддержку JSR-330. Spring - это отдельный контейнер DI, он не обменивается bean-компонентами CDI с JEE-сервером хоста, если это то, что вы имеете в виду. Вы можете использовать CDI в контейнере JEE или Spring beans - но вы не можете использовать оба (из коробки). - person Andre Steingress; 07.09.2017

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

person Lucky    schedule 17.11.2015
comment
что ты имеешь в виду под обязательным? - person mattyman; 21.06.2016
comment
@mattymanme Из документации, По умолчанию автоматическое подключение не выполняется, когда доступны нулевые компоненты-кандидаты; по умолчанию аннотированные методы, конструкторы и поля рассматриваются как указывающие на обязательные зависимости. Это поведение можно изменить, установив для обязательного атрибута значение false. Например: @Autowired(required=false). Проще говоря, атрибут required указывает, что свойство не требуется для целей автоматического подключения, свойство игнорируется, если оно не может быть с автоматическим подключением. - person Lucky; 21.06.2016
comment
заглянуть в открытый интерфейс исходного кода Autowired {/ ** * Объявляет, требуется ли аннотированная зависимость. * / boolean required () по умолчанию true; } открытый интерфейс Inject {} - person tarn; 18.04.2017

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

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

person tech.yenduri    schedule 26.11.2015
comment
Солнце мертво. Да здравствует солнце. - person Amrinder Arora; 13.02.2016
comment
как часто вы собираетесь менять фреймворк? просто любопытно - person Kay; 18.04.2017
comment
В большинстве проектов я видел Autowired, а не Inject. Я понимаю смысл ответа, но не могу проголосовать за него. - person Witold Kaczurba; 24.03.2018

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

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

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

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

В отличие от аннотации @Autowired, аннотация @Inject не имеет атрибута required. Следовательно, если зависимости не будут обнаружены - будет выброшено исключение.

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

person Community    schedule 08.10.2015
comment
Несмотря на то, что «@Inject» не имеет обязательного атрибута, в Java Docs указано: требуется внедрение элементов, помеченных с помощью «@Inject». Это, кажется, подразумевает, что если член не найден, его ввод не удастся. См. Документы Java: docs.oracle.com/javaee/7/ api / javax / inject / Inject.html - person Alex Theedom; 13.02.2016

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

  1. Область видимости по умолчанию для @Autowired beans - Singleton, тогда как при использовании аннотации JSR 330 @Inject она похожа на прототип Spring.
  2. В JSR 330, использующем @Inject, нет эквивалента @Lazy.
  3. В JSR 330 нет эквивалента @Value, использующего @Inject.
person Keyur Vyas    schedule 22.06.2015

@Inject не имеет "обязательного" атрибута

person Mike    schedule 19.08.2014

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

person Kushani5j    schedule 11.04.2018

@Autowired (required = false) По умолчанию внедрение зависимости для @Autowired должно быть выполнено, потому что значение атрибута required по умолчанию истинно. Мы можем изменить это поведение с помощью @Autowired (обязательно = false). В этом случае, если bean-компонент для внедрения зависимости не найден, это не приведет к ошибке.

См. https://www.concretepage.com/spring/spring-autowired-annotation#required-false

Но @Inject не нужен (required = false), это не приведет к ошибке, если зависимость не найдена.

person Ziaullhaq Savanur    schedule 18.06.2020