Инжектиране и анотации за ресурси и автоматично свързване

Каква е разликата между анотациите @Inject и @Resource и @Autowired?

Кога трябва да използваме всеки от тях?


person oxygenan    schedule 08.12.2013    source източник
comment
comment
възможен дубликат на @Resource срещу @Autowired   -  person Christian Strempfer    schedule 06.08.2015
comment
Хубаво обяснение с примери, които намерих, е тук   -  person marioosh    schedule 26.09.2015


Отговори (3)


Разликата между @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 ще стеснят търсенето първо по тип, след това по квалификатор и накрая по име.

person Haim Raman    schedule 08.12.2013
comment
Можете ли да кажете нещо за това, което се препоръчва? Най-добри практики? - person Jan-Terje Sørensen; 28.10.2014
comment
Ще се радвам да отговоря на вашия коментар, но предпочитам да запазя този отговор такъв, какъвто е. Бихте ли публикували нов въпрос. - person Haim Raman; 03.11.2014
comment
В последния ред споменахте, че @Autowired също търси по име, тъй като знам, че няма опция за име, нали? - person Ramesh Karna; 27.12.2014
comment
Вижте моята актуализация на описанието на @Autowired. от документите docs.spring.io/spring /docs/current/spring-framework-reference/ За резервно съвпадение името на компонента се счита за стойност на квалификатора по подразбиране. - person Haim Raman; 27.12.2014
comment
@Jan-TerjeSørensen Бих посъветвал да използвате независима от рамката @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 имат абсолютно същото поведение.

person eztam    schedule 07.11.2017
comment
Какво означава в таблицата колоната приложимо към типа? - person RBz; 23.10.2018
comment
@RBz Вижте: docs.oracle.com/javaee/6/ api/javax/annotation/Resource.html Ако анотацията се приложи към класа на компонента, анотацията декларира ресурс, който приложението ще търси по време на изпълнение. Но не съм сигурен дали това ще работи и с Spring DI. - person eztam; 23.10.2018

В допълнение към отговора на @Haim има добро описание на разликата между анотациите на Spring и JSR-330 (инжектиране на зависимости за Java) и как да използвате последните с Spring.

person Andriy Kryvtsun    schedule 18.04.2016