В чем разница между @Inject и @Autowired в Spring Framework? Какой из них использовать при каких условиях?
Я просматриваю некоторые блоги на SpringSource и в одном из блогов, автор использует @Inject
и я полагаю, что он также может использовать @Autowired
.
Вот фрагмент кода:
@Inject private CustomerOrderService customerOrderService;
Я не уверен в различии между @Inject
и @Autowired
и был бы признателен, если бы кто-то объяснил их разницу и какой из них использовать в какой ситуации?
Ответы
Ответ 1
Предполагая здесь, вы ссылаетесь на аннотации javax.inject.Inject
. @Inject
является частью Java CDI (Contexts and Dependency Injection), введенный в Java EE 6 (JSR-299), прочитайте больше. Spring выбрал поддержку с помощью @Inject
синонимом со своей аннотациями @Autowired
.
Итак, чтобы ответить на ваш вопрос, @Autowired
является Spring собственной (старой) аннотацией. @Inject
является частью новой технологии Java, называемой CDI, которая определяет стандарт для инъекции зависимостей, аналогичный Spring. В приложении Spring две аннотации работают так же, как Spring решил поддержать некоторые аннотации JSR-299 в дополнение к их собственным.
Ответ 2
Вот сообщение , в котором сравниваются @Resource
, @Inject
и @Autowired
, и, как представляется, выполняет довольно комплексную работу.
Из ссылки:
За исключением тестов 2 и 7, конфигурация и результаты были идентичны. Когда я посмотрел под капот, я решил, что '@Autowired и' @Вводная аннотация ведет себя одинаково. Оба эти аннотации используют "AutowiredAnnotationBeanPostProcessor для инъекции. '@Autowired и' @Inject могут использоваться сменный для инъекций Spring beans. Однако '@Resource в аннотации используется" CommonAnnotationBeanPostProcessor" для инъекций зависимостей. Несмотря на то, что они используют разные классы постпроцессора все они ведут себя почти одинаково. Ниже приводится сводка их пути выполнения.
Тесты 2 и 7 показывают, что ссылки автора - это "инъекция по имени поля" и "попытка разрешить bean с использованием плохого квалификатора" соответственно.
Заключение должно предоставить вам всю необходимую информацию.
Ответ 3
Чтобы справиться с ситуацией, в которой нет проводки, beans доступны с атрибутом @Autowired
required
, установленным на false
.
Но при использовании @Inject
интерфейс Provider работает с bean, что означает, что bean не вводится напрямую, а через поставщика.
Ответ 4
Начиная с Spring 3.0, Spring предлагает поддержку аннотаций зависимостей зависимостей JSR-330 (@Inject
, @Named
, @Singleton
).
В документации Spring содержится отдельный раздел, включая сравнения с их эквивалентами Spring.
Ответ 5
Ключевое различие (заметившее при чтении Весенних Документов) между @Autowired
и @Inject
заключается в том, что @Autowired
имеет @Autowired
'required', а @Inject не имеет атрибута 'required'.
Ответ 6
@Autowired
аннотация определена в структуре Spring.
@Inject
аннотация - стандартная аннотация, которая определена в стандарте "Инъекция зависимостей для Java" (JSR-330). Spring (начиная с версии 3.0) поддерживает обобщенную модель инъекции зависимостей, которая определена в стандарте JSR-330. (Рамки Google Guice и инфраструктура Picocontainer также поддерживают эту модель).
С помощью @Inject
можно ввести ссылку на реализацию интерфейса Provider
, которая позволяет вводить отложенные ссылки.
Аннотации @Inject
и @Autowired
- это почти полные аналоги. Также как @Autowired
аннотация, @Inject
аннотация может использоваться для автоматического связывания свойств, методов и конструкторов.
В отличие от @Autowired
аннотации, аннотация @Inject
не имеет required
атрибута. Поэтому, если зависимости не будут найдены - будет выбрано исключение.
Существуют также различия в пояснениях связывающих свойств. Если есть неоднозначность при выборе компонентов для инъекции, необходимо @Named
классификатор @Named
. В подобной ситуации для @Autowired
аннотации будет добавлен @Qualifier
(JSR-330 определяет его собственную аннотацию @Qualifier
и через эту аннотацию @Named
определяется).
Ответ 7
@Inject
не имеет атрибута 'required'
Ответ 8
Лучше использовать @Inject все время. Потому что это java-конфигурационный подход (предоставляемый солнцем), который делает наше приложение агностиком для фреймворка. Поэтому, если вы spring, также будут работать ваши классы.
Если вы используете @Autowired, он будет работать только с spring, потому что @Autowired - это spring предоставленная аннотация.
Ответ 9
В дополнение к вышесказанному:
- Область по умолчанию для @Autowired beans - это Singleton, тогда как использование аннотации JSR 330 @Inject похоже на Spring
prototype
.
- В JSR 330 нет эквивалента @Lazy, используя @Inject
- В JSR 330 нет эквивалента @Value, используя @Inject
Ответ 10
Аннотация @Inject
является одной из коллекций аннотаций JSR-330. У этого есть пути соответствия по типу, Матчу по квалификатору, Матч по имени. Эти пути выполнения действительны как для установки, так и для ввода полей. Поведение @Autowired
аннотации аналогично аннотации @Inject
. Единственное отличие состоит в том, что @Autowired
аннотация является частью Spring Framework. @Autowired
аннотация также имеет указанные выше пути выполнения. Поэтому я рекомендую @Autowired
для вашего ответа.