2013-12-08 15 views
46

Jaka jest różnica pomiędzy adnotacjami @Inject i @Resource i @Autowired?Adnotacje Inject i Resource oraz Autowired

Kiedy powinniśmy użyć każdego z nich?

+2

http://docs.spring.io/spring/docs/3.2.4.RELEASE/spring-framework-reference/htmlsingle/#beans-standard-annotations, http://docs.spring.io /spring/docs/3.2.4.RELEASE/spring-framework-reference/htmlsingle/#beans-resource-annotation –

+1

możliwy duplikat [@Resource vs @Apiowired] (http://stackoverflow.com/questions/4093504/resource -vs-autowired) –

+1

Dobre wyjaśnienie z przykładami, które znalazłem, jest [tutaj] (http://blogs.sourceallies.com/2011/08/spring-injection-with-resource-and-autowired/) – marioosh

Odpowiedz

94

Różnica między @Inject vs. @Autowire vs. @Resource?

@Autowired: sprężyna poprawność adnotacji (w przeciwieństwie do @Inject i @Resource), które wtryskiwać zasobu ubocznych typu, to jest przez klasę przez interfejs pola opatrzony lub wykonawcy. W przypadku kilku implementacji interfejsu lub podklasy możemy zawęzić wybór za pomocą adnotacji @Qualifier, aby uniknąć niejasności. W przypadku dopasowania rezerwowego nazwa komponentu bean jest uważana za domyślną wartość kwalifikatora. Mimo że możesz użyć tej konwencji, aby odnosić się do konkretnych fasoli po imieniu, @Autowired jest zasadniczo oparty na zastrzyku sterowanym typem z opcjonalnymi semantycznymi kwalifikatorami.

@Inject: Adnotacja na podstawie JSR-330 (Dependency Injection for Java) identyfikuje konstruktorów do wstrzyknięć, metod i pól. Ta adnotacja to niemal zupełny zamiennik adnotacji Spring @Autowired. Zamiast więc używać adnotacji @ specyficznej dla Springa, możesz użyć @Inject. Jedną z różnic między @Aemowired i @Inject jest to, że @Inject nie ma wymaganego pola, więc na wypadek, gdybyśmy nie znaleźli odpowiedniego obiektu do wstrzyknięcia, to się nie powiedzie, podczas gdy @Acjowired może użyć required = false i zezwolić na puste pole (tylko Jeśli wymagane!). Zaletą adnotacji @Inject jest to, że zamiast bezpośrednio wstrzykiwać referencję, możesz poprosić @Inject o wstrzyknięcie dostawcy. Interfejs dostawcy umożliwia między innymi leniwe wstrzykiwanie odniesień do ziaren i wstrzykiwanie wielu wystąpień komponentu bean. Jeśli mamy kilka implementacji interfejsu lub podklasy, możemy zawęzić wybór za pomocą @Named adnotation, aby uniknąć niejasności. @ Notowana adnotacja działa podobnie jak Spring's @Qualifier

@Resource: adnotacja oparta na JSR-250. @Resource jest bardzo podobny do @Autowired i @Inject, ale główna różnica polega na ścieżkach wykonania, które są potrzebne do znalezienia wymaganej fasoli do wstrzyknięcia. @Resource zawęzi wyszukiwanie najpierw według nazwy, a następnie według typu i na końcu według kwalifikatorów (ignorowane, jeśli dopasowanie zostanie znalezione po nazwie). @Aemowired i @Inject zawęzić wyszukiwanie najpierw według typu, a następnie kwalifikatora i na końcu według nazwy.

+5

Czy możesz powiedzieć coś o co jest zalecane? Najlepsze praktyki? –

+1

Z przyjemnością odpowiem na Twój komentarz, ale wolę zachować tę odpowiedź w niezmienionej postaci. Czy opublikujesz nowe pytanie? –

+1

W ostatniej linii wspomniałeś @Autowired również wyszukiwanie według nazwy, ponieważ wiem, że nie ma opcji nazwy, prawda? –

1

Oprócz @Haim, należy odpowiedzieć na there is good description różnicę między adnotacjami Spring i JSR-330 (Dependency Injection for Java) i jak korzystać z ostatniego z Spring.

2
|------------|---------------|---------------|---------------|-----------------------| 
|   | 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 | 
|------------|---------------|---------------|---------------|-----------------------|