В чем разница между @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 эти две аннотации работают так же, как Spring решил поддержать некоторые аннотации JSR-299 в дополнение к их собственным.

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

По ссылке:

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

Тесты 2 и 7, на которые ссылается автор, - это "внедрение по имени поля" и "попытка разрешить бин с использованием неверного квалификатора", соответственно.

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

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

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

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

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

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

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

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

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

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

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

@Inject аннотация - это стандартная аннотация, которая определена в стандарте "Внедрение зависимостей для Java" (JSR-330). Spring (начиная с версии 3.0) поддерживает обобщенную модель внедрения зависимостей, которая определена в стандарте JSR-330. ( Фреймворки Google Guice и http://picocontainer.com/web также поддерживают эту модель).

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

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

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

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

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

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

Пожалуйста, посмотрите https://www.concretepage.com/spring/spring-autowired-annotation

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

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

Другие вопросы по тегам