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