Я просматриваю некоторые блоги на SpringSource и в одном из блогов, которые использует автор, @Inject
и я полагаю, что он также может использовать @Autowired
.
Вот кусок кода:
@Inject private CustomerOrderService customerOrderService;
Я не уверен в разнице между @Inject
и @Autowired
буду признателен, если кто-то объяснит их различие и какой из них использовать в какой ситуации?
Ответы:
Предполагая, что здесь вы имеете в виду
javax.inject.Inject
аннотации.@Inject
является частью стандарта Java CDI ( внедрение контекстов и зависимостей ), представленного в Java EE 6 (JSR-299), подробнее . Spring выбрал поддержку использования@Inject
синонимов с собственной@Autowired
аннотацией.Итак, чтобы ответить на ваш вопрос,
@Autowired
это собственная аннотация Spring.@Inject
является частью новой технологии Java под названием CDI, которая определяет стандарт для внедрения зависимостей, аналогичный Spring. В приложении Spring эти две аннотации работают так же, как Spring решил поддержать некоторые аннотации JSR-299 в дополнение к их собственным.источник
@Inject
это отдельный JSR (JSR-330) от CDI (JSR-299).@Inject
аннотацию JSR, лучше использовать@Autowired
блокировку базы кода с помощью Spring DI.@Inject
одного не гарантирует независимость от фреймворка. Вы также должны были бы объявить инъецируемые bean-компоненты без каркасно-зависимых механизмов, таких как Spring@Component
илиapplication.xml
, но использовать@Named
и@Singleton
на уровне класса. Не знаю, действительно ли какой-нибудь проект Spring сегодня объявляет такие бины - я даже никогда не слышал ни о каком проекте, который мигрировал из Spring в JEE ...Вот запись в блоге, которая сравнивает
@Resource
,@Inject
и@Autowired
, и, кажется, делает довольно сложную работу.По ссылке:
Тесты 2 и 7, на которые ссылается автор, - это «внедрение по имени поля» и «попытка разрешить бин с использованием неверного квалификатора» соответственно.
Заключение должно предоставить вам всю необходимую информацию.
источник
Для обработки ситуации, в которой отсутствует проводка, доступны bean-компоненты с
@Autowired
required
установленным атрибутомfalse
.Но при использовании
@Inject
интерфейс провайдера работает с бином, что означает, что бин вводится не напрямую, а с провайдером.источник
По состоянию Spring 3.0, Spring предлагает поддержку JSR-330 аннотации инъекций зависимостей (
@Inject
,@Named
,@Singleton
).В документации Spring есть отдельный раздел о них, включая сравнения с их эквивалентами Spring.
источник
Основное различие (замеченное при чтении документов Spring ) между
@Autowired
и@Inject
заключается в том, что он@Autowired
имеет атрибут 'required', в то время как @Inject не имеет атрибута 'required'.источник
@Autowired(required=false)
Простыми словами: «required
Атрибут указывает, что свойство не требуется для целей автоматического подключения, свойство игнорируется, если оно не может быть подключено автоматически».Лучше использовать @Inject все время. Потому что именно подход к настройке Java (предоставляемый Sun) делает наше приложение независимым от фреймворка. Так что, если вы весной, ваши занятия будут работать.
Если вы используете @Autowired, он будет работать только с пружиной, потому что @Autowired - это аннотация, предоставляемая пружиной.
источник
@Autowired
аннотация определяется в рамках Spring.@Inject
аннотация - это стандартная аннотация, которая определена в стандарте «Внедрение зависимостей для Java» (JSR-330) . Spring (начиная с версии 3.0) поддерживает обобщенную модель внедрения зависимостей, которая определена в стандарте JSR-330. ( Фреймворки Google Guice и Picocontainer также поддерживают эту модель).С
@Inject
может быть введена ссылка на реализациюProvider
интерфейса, которая позволяет внедрять отложенные ссылки.Аннотации
@Inject
и@Autowired
- это почти полные аналогии. Помимо@Autowired
аннотации,@Inject
аннотацию можно использовать для свойств, методов и конструкторов автоматической привязки.В отличие от
@Autowired
аннотации,@Inject
аннотация не имеетrequired
атрибута. Поэтому, если зависимости не будут найдены - будет сгенерировано исключение.Существуют также различия в уточнениях связующих свойств. Если в выборе компонентов для инъекций существует неопределенность,
@Named
следует добавить классификатор. В аналогичной ситуации для@Autowired
аннотации будет добавлен@Qualifier
классификатор (JSR-330 определяет свою собственную@Qualifier
аннотацию и с помощью этого квалификатора@Named
определяется аннотация ).источник
@Inject
не имеет обязательного атрибутаисточник
В дополнение к вышесказанному:
@Autowired
bean-компонентов - Singleton, тогда как при использовании@Inject
аннотации JSR 330 это похоже на на прототип Spring .@Inject
.@Inject
.источник
@Inject
Аннотаций является одним из коллекции JSR-330 аннотации. Это имеет соответствие по типу, соответствие по классификатору, соответствие по имени пути выполнения. Эти пути выполнения действительны как для установки, так и для внедрения в поле. Поведение@Autowired
аннотации такое же, как и у@Inject
аннотации. Единственное отличие состоит в том, что@Autowired
аннотация является частью среды Spring.@Autowired
аннотация также имеет вышеуказанные пути выполнения. Поэтому я рекомендую@Autowired
для вашего ответа.источник