Инъекционные и ресурсные и автообновленные annotations

В чем разница между @Inject и @Resource и @Autowired аннотациями?

Когда мы должны использовать каждый из них?

Разница между @Inject и @Autowire vs. @Resource?

@Autowired: примечание о пружинной пружине (в отличие от @Inject и @Resource), которые вводят ресурс по типу, то есть по classу интерфейса интерфейса аннотированного поля или подрядчика. Если у нас мало реализации интерфейса или подclassа, мы можем сузить выбор, используя аннотацию @Qualifier, чтобы избежать двусмысленности. Для ответного совпадения имя компонента считается значением квалификатора по умолчанию. Хотя вы можете использовать это соглашение для обращения к конкретным компонентам по имени, @Autowired в основном относится к инъекции с использованием типов с необязательными семантическими classификаторами.

@Inject: Аннотации, основанные на JSR-330 (Dependency Injection for Java), идентифицируют конструкторы, методы и поля для инъекций. Эта аннотация представляет собой почти полную замену для примечания Spring @Autowired. Таким образом, вместо использования annotations @Autowired, специфичной для Spring, вы можете использовать @Inject. Одна из отличий между @Autowired и @Inject заключается в том, что @Inject не имеет требуемого поля, поэтому, если нам не удастся найти подходящий объект для ввода, он будет терпеть неудачу, а @Autowired может использоваться required = false и разрешить поле с нулевым значением (только если необходимо!). Преимущество annotations @Inject заключается в том, что вместо того, чтобы вводить ссылку напрямую, вы можете попросить @Inject ввести поставщика. Интерфейс Provider позволяет, среди прочего, ленивую инъекцию ссылок на бобовые и инъекцию нескольких экземпляров компонента. Если у нас мало реализации интерфейса или подclassа, мы можем сузить выбор, используя аннотацию @Named, чтобы избежать двусмысленности. @Named аннотация работает так же, как Spring @Qualifier

@Resource: аннотация, основанная на JSR-250. @Resource очень похож на @Autowired и @Inject, но основное отличие – это пути выполнения, необходимые для поиска необходимого компонента для вставки. @Resource сужает поиск сначала по имени, затем по типу и, наконец, по Квалификациям (игнорируется, если совпадение найдено по имени). @Autowired и @Inject сужают поиск сначала по типу, затем по квалификатору и, наконец, по имени.

 |------------|---------------|---------------|---------------|-----------------------| | | Setter/Field | Constructor | Applicable to | Matching order | | | injection | injection | type | | |------------|---------------|---------------|---------------|-----------------------| | @Autowired | X | X | | Type, Qualifier, Name | |------------|---------------|---------------|---------------|-----------------------| | @Inject | X | X | | Type, Qualifier, Name | |------------|---------------|---------------|---------------|-----------------------| | @Resource | X | | X | Name, Type, Qualifier | |------------|---------------|---------------|---------------|-----------------------| 

Таким образом, в Spring инъекции зависимостей @Inject и @Autowired имеют точно такое же поведение.

В дополнение к ответу @Haim есть хорошее описание разницы между примечаниями Spring и JSR-330 (зависимость от Injection for Java) и использованием последнего с Spring.

Давайте будем гением компьютера.