@ 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")
@Resource
, ponieważ został ratyfikowany przez ludzi z jsr.Ktoś o tym myśli?
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.
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.
@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.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.
@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.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
- dopasowania według typu
- ]}
- mecze przez Nazwa
@Resource
- mecze po nazwie
- dopasowania według typu
- ogranicza kwalifikatory (ignorowane, jeśli dopasowanie zostanie znalezione po nazwie)
Jakich adnotacji (lub kombinacji) powinienem użyć do wstrzykiwania mojej fasoli?
Jawnie nazwij swój komponent [@Component ("beanName")]
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.
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
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.
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:)
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.
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ć.
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.
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.
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)
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