В чем разница между @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), подробнее. Весна выбрала поддержку с помощью@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, что ссылки автора являются "инъекция по имени Поля" и "попытка разрешения боба с использованием плохого квалификатора", соответственно.
заключение должно дать вам всю необходимую информацию.
чтобы справиться с ситуацией, в которой нет проводки, бобы доступны с
@Autowired
required
атрибут установлен в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 все время. Потому что это подход к конфигурации java(предоставленный sun), который делает наше приложение агностическим для фреймворка. Так что если вы весной и ваши классы будут работать.
Если вы используете @Autowired, он будет работать только с spring, потому что @Autowired-это аннотация spring.
В дополнение к вышесказанному:
- область по умолчанию для @ Autowired beans является одноэлементной, тогда как использование аннотации JSR 330 @Inject похоже на Spring
prototype
.- нет эквивалента @Lazy в JSR 330 с помощью @Inject
- в JSR 330 нет эквивалента @Value с помощью @Inject
The
@Inject
аннотация является одним из JSR-330 аннотации коллекции. Это имеет соответствие по типу, соответствие по Квалификатору, соответствие по имени пути выполнения. Эти пути выполнения действительны как для установки, так и для ввода поля.Поведение@Autowired
аннотация такая же, как@Inject
Примечание. Единственное отличие-это@Autowired
аннотация является частью Spring framework.@Autowired
аннотация также имеет вышеуказанные пути выполнения. Поэтому я рекомендую@Autowired
для вашего ответа.