@ Resource vs @ Autowired

Która adnotacja, @ Resource (jsr250) lub @ Autowired (Spring-specific) czy powinienem używać w DI?

Z powodzeniem używałem zarówno w przeszłości, @Resource(name="blah") jak i @Autowired @Qualifier("blah")

Odruchem jest trzymanie się tagu @Resource, ponieważ został ratyfikowany przez ludzi z jsr.
Ktoś o tym myśli?
Author: Mahozad, 2010-11-04

11 answers

W spring pre-3.0 nie ma znaczenia który.

W spring 3.0 jest wsparcie dla standardu (JSR-330 ) adnotacja @javax.inject.Inject - Użyj go, z kombinacją @Qualifier. Zauważ, że spring obsługuje teraz również meta-adnotację @javax.inject.Qualifier:

@Qualifier
@Retention(RUNTIME)
public @interface YourQualifier {}

Więc możesz mieć

<bean class="com.pkg.SomeBean">
   <qualifier type="YourQualifier"/>
</bean>

Lub

@YourQualifier
@Component
public class SomeBean implements Foo { .. }

A następnie:

@Inject @YourQualifier private Foo foo;

To sprawia, że mniej używa się nazw łańcuchów, które mogą być błędnie pisane i są trudniejsze do utrzymania.


Co do pierwotnego pytania: oba, bez podania żadnych atrybutów adnotacji, wykonują iniekcję według typu. Różnica wynosi:

  • @Resource pozwala na podanie nazwy wstrzykiwanej fasoli
  • @Autowired pozwala oznaczyć go jako nieobowiązkowy.
 157
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-01 09:45:57

Zarówno @Autowired (LUB @Inject), jak i @Resource działają równie dobrze. Ale istnieje różnica pojęciowa lub różnica w znaczeniu

  • @Resource oznacza zdobądź mi znany zasób po nazwie. Nazwa jest pobierana z nazwy przypisanego ustawiacza lub pola lub jest pobierana z parametru name-Parameter.
  • @Inject lub @Autowired spróbuj podłączyć do odpowiedni inny składnik według typu.
Więc zasadniczo są to dwa całkiem odrębne pojęcia. Niestety Spring-implementacja @Resource ma wbudowany fallback, który uruchamia się, gdy rozdzielczość według nazwy nie powiedzie się. W tym przypadku, to spada z powrotem do @Autowired-rodzaj rozdzielczości według typu. Chociaż ta alternatywa jest wygodna, IMHO powoduje wiele zamieszania, ponieważ ludzie nie są świadomi różnicy pojęciowej i mają tendencję do używania @Resource do autowiringu opartego na typach.
 406
Author: Ichthyo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-10 10:58:35

Podstawowa różnica polega na tym, że @Autowired jest adnotacją sprężynową. Natomiast @Resource jest określony przez JSR-250, jak sam Pan wskazał. Ta ostatnia jest więc częścią Javy, podczas gdy ta pierwsza jest specyficzna dla wiosny.

Dlatego masz rację sugerując to w pewnym sensie. Odkryłem, że ludzie używają @Autowired z @Qualifier, ponieważ jest bardziej wydajny. Przejście z niektórych RAM do innych jest uważane za bardzo mało prawdopodobne, jeśli nie mit, zwłaszcza w przypadku Wiosny.
 69
Author: Adeel Ansari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-04 03:39:51

Chciałbym podkreślić jeden komentarz @ Jules na tę odpowiedź na to pytanie. Komentarz zawiera przydatny link: Spring Injection with @Resource, @Autowired and @Inject . Zachęcam do przeczytania go w całości, jednak oto krótkie podsumowanie jego przydatności: {]}

Jak wybrać właściwą implementację?

@Autowired i @Inject

  1. dopasowania według typu
  2. ]}
  3. mecze przez Nazwa

@Resource

  1. mecze po nazwie
  2. dopasowania według typu
  3. ogranicza kwalifikatory (ignorowane, jeśli dopasowanie zostanie znalezione po nazwie)

Jakich adnotacji (lub kombinacji) powinienem użyć do wstrzykiwania mojej fasoli?

  1. Jawnie nazwij swój komponent [@Component ("beanName")]

  2. Użyj {[2] } z atrybutem name [@Resource (name= "beanName")]

Dlaczego nie powinienem używać @Qualifier?

Unikaj @Qualifier adnotacji, chyba że chcesz utworzyć listę podobnych fasoli. Na przykład możesz oznaczyć zbiór reguł specjalną adnotacją @Qualifier. Takie podejście ułatwia wprowadzenie grupy klas reguł do listy, która może być używana do przetwarzania danych.

Czy zastrzyk fasoli Spowalnia mój program?

Skanowanie określonych pakietów w poszukiwaniu komponentów [context:component-scan base-package="com.sourceallies.person"]. Chociaż spowoduje to więcej konfiguracji component-scan, zmniejsza to szansę, że dodasz niepotrzebne komponenty do Twojego kontekstu sprężynowego.


Bibliografia: Spring Injection with @Resource, @Autowired and @Inject

 52
Author: Stephan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:36

Oto co dostałem z Spring 3.0.X Reference Manual :-

Końcówka

Jeśli zamierzasz wyrazić iniekcję z adnotacją po nazwie, zrób nie używaj przede wszystkim @Autowired, nawet jeśli jest technicznie zdolny do odwoływanie się do nazwy fasoli poprzez wartości @ Qualifier. Zamiast tego użyj JSR-250 @adnotacja zasobu, która jest semantycznie zdefiniowana na zidentyfikować konkretny element docelowy po jego unikalnej nazwie, z deklarowany typ jest nieistotny dla proces dopasowywania.

Jako swoista konsekwencja tej różnicy semantycznej, ziarna, które są same zdefiniowane jako typ kolekcji lub mapy nie mogą być wtryskiwane poprzez @Autowired, ponieważ Dopasowanie typu nie jest prawidłowo stosowane za nich. Użyj @ Resource dla takich fasoli, odnosząc się do konkretnego kolekcja lub mapa po unikalnej nazwie.

@ Autowired stosuje się do pól, konstruktorów i wielu argumentów metod, pozwalających na zawężenie adnotacji kwalifikujących w na poziom parametrów. Natomiast @Resource jest obsługiwane tylko dla pól oraz metody ustawiania właściwości bean z pojedynczym argumentem. Jako konsekwencją, trzymać się kwalifikacji, jeśli celem wstrzyknięcia jest konstruktor lub metoda wielowątkowa.

 38
Author: Kartik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-17 10:38:32

@ Autowired + @ Qualifier będzie działać tylko z SPRING DI, jeśli chcesz użyć innego DI w przyszłości @ Resource jest dobrą opcją.

Inna różnica, która okazała się bardzo znacząca, to @Qualifier nie obsługuje dynamicznego okablowania fasoli, ponieważ @Qualifier nie obsługuje funkcji zastępczych, podczas gdy @Resource robi to bardzo dobrze.

Na przykład: jeśli masz interfejs z wieloma implementacjami, takimi jak Ta

interface parent {

}
@Service("actualService")
class ActualService implements parent{

}
@Service("stubbedService")
class SubbedService implements parent{

}

Z @Autowired & @ Qualifier musisz ustawić konkretne dziecko realizacja jak

@Autowired
@Qualifier("actualService") or 
@Qualifier("stubbedService") 
Parent object;

, który nie zapewnia zastępczego podczas gdy za pomocą @ Resource możesz umieścić zastępczy plik i użyć właściwości file, aby wstrzyknąć określoną implementację potomną, taką jak

@Resource(name="${service.name}")
Parent object;  

Gdzie service.name jest ustawione w pliku właściwości jako

#service.name=actualService
 service.name=stubbedService

Mam nadzieję, że komuś to pomoże:)

 18
Author: Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-26 04:08:42

Oba są równie dobre. Zaletą korzystania z zasobów jest w przyszłości, jeśli chcesz inny Framework DI inny niż spring, twoje zmiany w kodzie będą znacznie prostsze. Korzystanie z Autowired kod jest ściśle powiązany ze sprężynami DI.

 17
Author: Teja Kantamneni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-04 02:59:27

Z @Resource możesz wykonać samonapinanie bean, może to być potrzebne do uruchomienia wszystkich dodatkowych Logik dodanych przez post procesory Bean, takich jak transakcje lub kwestie związane z bezpieczeństwem.

Ze sprężyną 4.3 + @Autowired jest również w stanie to zrobić.

 3
Author: Bohdan Levchenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-20 20:25:51

@Resource jest często używany przez obiekty wysokiego poziomu, zdefiniowane za pomocą JNDI. @Autowired lub @Inject będą używane przez bardziej popularne fasolki.

Z tego co wiem, to nie jest specyfikacja, ani nawet konwencja. Bardziej logiczny jest sposób, w jaki standardowy kod będzie używał tych adnotacji.
 2
Author: Nicolas Zozol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-07 18:06:05

Jako uwaga tutaj: SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext i SpringBeanAutowiringSupport.processInjectionBasedOnServletContext nie działa z adnotacją @Resource. Więc są różnice.

 0
Author: msangel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-17 17:12:02

Kiedy analizujesz krytycznie z klas bazowych tych dwóch adnotacji.Zdasz sobie sprawę z następujących różnic.

@Autowired używa AutowiredAnnotationBeanPostProcessor do wprowadzania zależności.
@Resource używa CommonAnnotationBeanPostProcessor do wprowadzania zależności.

Mimo że używają różnych klas post procesorów, wszystkie zachowują się niemal identycznie. Różnice krytyczne leżą w ich ścieżkach realizacji, które podkreśliłem poniżej.

@Autowired / @Inject

1.Mecze według typu
2.Ograniczenia przez kwalifikatory
3.Mecze według Nazwa

@Resource

1.Mecze według nazwy
2.Mecze według typu
3.Ograniczenie przez kwalifikatory (ignorowane, jeśli dopasowanie zostanie znalezione po nazwie)

 0
Author: Amos Kosgei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-05 11:23:37