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

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

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

@Inject private CustomerOrderService customerOrderService;

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

10 ответов


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

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


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

из ссылки:

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

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

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


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

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


начиная с 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 фреймворки и Picocontainer framework также поддерживает эту модель).

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

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

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

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


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


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

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


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

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

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