Каква е разликата между анотациите @Inject
и @Resource
и @Autowired
?
Кога трябва да използваме всеки от тях?
Каква е разликата между анотациите @Inject
и @Resource
и @Autowired
?
Кога трябва да използваме всеки от тях?
Разликата между @Inject срещу @Autowire срещу @Resource?
@Autowired: пролетна анотация за приличие (за разлика от @Inject и @Resource), която инжектира ресурс по тип, т.е. по класа на по интерфейса на анотираното поле или изпълнител. В случай, че имаме малко имплементации на интерфейс или подклас, можем да стесним селекцията с помощта на анотацията @Qualifier, за да избегнем неяснота. За резервно съвпадение името на компонента се счита за стойност на квалификатора по подразбиране. Въпреки че можете да използвате тази конвенция, за да се позовавате на конкретни bean-ове по име, @Autowired е основно за управлявано от тип инжектиране с незадължителни семантични квалификатори.
@Inject: Анотацията, базирана на JSR-330 (инжектиране на зависимости за Java), идентифицира инжектируеми конструктори, методи и полета. Тази анотация е почти пълна замяна на анотацията @Autowired на Spring. Така че, вместо да използвате специфичната за Spring анотация @Autowired, можете да изберете да използвате @Inject. Една от разликите между @Autowired и @Inject е, че @Inject няма задължителното поле, така че в случай, че не успеем да намерим подходящ обект за инжектиране, той ще се провали, докато @Autowired може да използва required=false и позволява нулево поле (само ако е необходимо!). Предимството на анотацията @Inject е, че вместо да инжектирате препратка директно, можете да поискате от @Inject да инжектира доставчик. Интерфейсът на доставчика позволява, наред с други неща, лениво инжектиране на референции на bean и инжектиране на множество екземпляри на bean. В случай, че имаме малко имплементации на интерфейс или подклас, можем да стесним селекцията с помощта на анотацията @Named, за да избегнем неяснота. Анотацията @Named работи много като @Qualifier на Spring
@Resource: анотация, базирана на JSR-250. @Resource е доста подобен на @Autowired и @Inject, но основната разлика е в пътищата за изпълнение, предприети за намиране на необходимия bean за инжектиране. @Resource ще стесни търсенето първо по име, след това по тип и накрая по квалификации (игнорира се, ако се намери съвпадение по име). @Autowired и @Inject ще стеснят търсенето първо по тип, след това по квалификатор и накрая по име.
@Inject
анотация навсякъде. Причината, ако решите да промените Spring на напр. Google Guice (или всяка друга рамка JSR-330 DI), не бихте променили кода си.
- person Andriy Kryvtsun; 18.04.2016
|------------|---------------|---------------|---------------|-----------------------|
| | 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 (инжектиране на зависимости за Java) и как да използвате последните с Spring.