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

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

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

@Inject private CustomerOrderService customerOrderService;

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

Ответ 1

Предполагая здесь, вы ссылаетесь на аннотации 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 в дополнение к их собственным.

Ответ 2

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

Из ссылки:

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

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

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

  • Область по умолчанию для @Autowired beans - это Singleton, тогда как использование аннотации JSR 330 @Inject похоже на Spring prototype.
  • В JSR 330 нет эквивалента @Lazy, используя @Inject
  • В JSR 330 нет эквивалента @Value, используя @Inject

Ответ 10

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