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


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

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

@Inject private CustomerOrderService customerOrderService;

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

10 573

10 ответов:

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

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

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

из ссылки:

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

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

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

чтобы справиться с ситуацией, в которой нет проводки, бобы доступны с @Autowiredrequired атрибут установлен в false.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. область по умолчанию для @ Autowired beans является одноэлементной, тогда как использование аннотации JSR 330 @Inject похоже на Spring prototype.
  2. нет эквивалента @Lazy в JSR 330 с помощью @Inject
  3. в JSR 330 нет эквивалента @Value с помощью @Inject

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