В чем разница между @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, что ссылки автора являются "инъекция по имени Поля" и "попытка разрешения боба с использованием плохого квалификатора", соответственно.
заключение должно дать вам всю необходимую информацию.
чтобы справиться с ситуацией, в которой нет проводки, бобы доступны с
@Autowiredrequiredатрибут установлен в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для вашего ответа.