В чем разница между аннотациями @Inject
и @Resource
и @Autowired
?
Когда мы должны использовать каждый из них?
В чем разница между аннотациями @Inject
и @Resource
и @Autowired
?
Когда мы должны использовать каждый из них?
Разница между @Inject и @Autowire vs. @Resource?
@Autowired: spring аннотации правдоподобия (в отличие от @Inject и @Resource), которые вводят ресурс по типу, то есть по классу интерфейса интерфейса аннотированного поля или подрядчика, Если у нас мало реализации интерфейса или подкласса, мы можем сузить выбор, используя аннотацию @Qualifier, чтобы избежать двусмысленности. Для ответного соответствия имя bean считается значением квалификатора по умолчанию. Хотя вы можете использовать это соглашение для ссылки на конкретный beans по имени, @Autowired в основном связан с вводом с типом с дополнительными семантическими классификаторами.
@Inject: Аннотации, основанные на JSR-330 (Dependency Injection for Java), идентифицируют конструкторы, методы и поля для инъекций. Эта аннотация является почти полной заменой замены для Spring s @Автоматическая аннотация. Таким образом, вместо использования Spring -специфического @Autowired аннотации вы можете использовать @Inject. Одна из отличий между @Autowired и @Inject заключается в том, что @Inject не имеет требуемого поля, поэтому, если нам не удастся найти подходящий объект для ввода, он будет терпеть неудачу, а @Autowired может использоваться required = false и разрешить поле с нулевым значением (только если необходимо!). Преимущество аннотации @Inject заключается в том, что вместо того, чтобы вводить ссылку напрямую, вы можете попросить @Inject ввести поставщика. Интерфейс провайдера включает, помимо прочего, ленивую инъекцию ссылок bean и вставку нескольких экземпляров bean. Если у нас мало реализации интерфейса или подкласса, мы можем сузить выбор, используя аннотацию @Named, чтобы избежать двусмысленности. @Named аннотация работает так же, как Spring s @Qualifier
@Resource: аннотация, основанная на JSR-250. @Resource очень похож на @Autowired и @Inject, но основное отличие - это пути выполнения, необходимые для поиска требуемого bean для ввода. @Resource сужает поиск сначала по имени, затем по типу и, наконец, по Квалификациям (игнорируется, если совпадение найдено по имени). @Autowired и @Inject сужают поиск сначала по типу, затем по квалификатору и, наконец, по имени.
В дополнение к @Haim answer есть хорошее описание разницы между Spring и аннотациями JSR-330 (зависимость для Java) и как использовать последнее с Spring.
|------------|---------------|---------------|---------------|-----------------------|
| | Setter/Field | Constructor | Applicable to | Matching order |
| | injection | injection | type | |
|------------|---------------|---------------|---------------|-----------------------|
| @Resource | X | | X | Name, Type, Qualifier |
|------------|---------------|---------------|---------------|-----------------------|
| @Autowired | X | X | | Type, Qualifier, Name |
|------------|---------------|---------------|---------------|-----------------------|
| @Inject | X | X | | Type, Qualifier, Name |
|------------|---------------|---------------|---------------|-----------------------|