В чем разница между @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, на которые ссылается автор, - это "внедрение по имени поля" и "попытка разрешить бин с использованием неверного квалификатора", соответственно.
Заключение должно предоставить вам всю необходимую информацию.
Чтобы справиться с ситуацией, в которой нет проводки, бобы доступны с @Autowired
required
атрибут установлен в 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 - это аннотация, предоставляемая пружиной.
В дополнение к вышесказанному:
- Область действия по умолчанию для компонентов @Autowired - Singleton, тогда как при использовании аннотации @SRject JSR 330 она похожа на Spring
prototype
, - Нет эквивалента @Lazy в JSR 330, использующем @Inject
- В 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
определено).
@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
за ваш ответ.