Jaka jest różnica między @Inject i @Autowired w Spring Framework? Którego użyć pod jakim warunkiem?

Przeglądam kilka blogów na SpringSource i na jednym z blogów autor używa @Inject i przypuszczam, że może też używać @Autowired.

Oto fragment kodu:

@Inject private CustomerOrderService customerOrderService;

Nie jestem pewien różnicy między @Inject i @Autowired i byłbym wdzięczny, gdyby ktoś wyjaśnił swoją różnicę i który z nich użyć w jakiej sytuacji?

Author: Mahozad, 2011-08-22

10 answers

Zakładając, że tutaj odnosisz się dojavax.inject.Inject Przypisy @Inject jest częścią standardu Java CDI ( Contexts and Dependency Injection ) wprowadzonego w Java EE 6 (JSR-299), Czytaj więcej . Spring zdecydował się na wsparcie używając @Inject synonimicznie z własną @Autowired adnotacją.

Więc, odpowiadając na twoje pytanie, @Autowired jest własną (dziedziczną) adnotacją Springa. @Inject jest częścią nowej technologii Java o nazwie CDI, która definiuje standard iniekcji zależności podobny do Wiosna. W aplikacji Spring dwie adnotacje działają tak samo, jak Spring zdecydowała się wspierać niektóre adnotacje JSR-299 oprócz własnych.

 601
Author: pap,
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-01-11 18:06:01

Oto blog post który porównuje @Resource, @Inject, i wydaje się wykonywać dość obszerną pracę.

Z linku:

Z wyjątkiem testu 2 i 7 konfiguracja i wyniki były identyczne. Kiedy zajrzałem pod maskę stwierdziłem, że Adnotacje' @Autowired 'i' @Inject ' zachowują się identycznie. Obie te adnotacje używają 'AutowiredAnnotationBeanPostProcessor' do inject dependencies. '@Autowired ' i '@ Inject ' mogą być używane wymienne do wstrzykiwania fasoli wiosennej. Jednak "@ zasób" adnotacja wykorzystuje "CommonAnnotationBeanPostProcessor" do wprowadzania zależności. Mimo że używają różnych klas post procesorów wszystkie zachowują się prawie identycznie. Poniżej znajduje się podsumowanie ich ścieżki egzekucji.

Testy 2 i 7, że autor odwołuje się odpowiednio "injection by field name" I "an attempt at resolution a bean using a bad qualifier".

Wniosek powinien dać ci wszystkie potrzebne informacje.

 142
Author: nicholas.hauschild,
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
2011-08-22 05:28:37

Aby poradzić sobie z sytuacją, w której nie ma okablowania, beans są dostępne z @Autowired required atrybut ustawiony na false.

Ale podczas korzystania z @Inject, Interfejs Provider działa z Bean, co oznacza, że bean nie jest wstrzykiwany bezpośrednio, ale z dostawcą.

 26
Author: amits,
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-05-29 02:29:11

Od wersji Spring 3.0, Spring oferuje wsparcie dla JSR-330 dependency injection (@Inject, @Named, @Singleton).

Istnieje oddzielna sekcja w dokumentacji sprężyny o nich, w tym porównania do ich odpowiedników sprężyny.

 22
Author: Andre Steingress,
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-04-27 12:10:13

Kluczowa różnica(zauważona podczas czytania Spring Docs) pomiędzy @Autowired i @Inject jest taka, że @Autowired ma atrybut 'required', podczas gdy @Inject nie ma atrybutu 'required'.

 18
Author: Lucky,
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-05-18 12:47:01

@Autowired adnotacja jest zdefiniowana w ramach Spring.

@Inject adnotacja jest standardową adnotacją, która jest zdefiniowana w standardzie "Dependency Injection for Java" (JSR-330) . Spring (od wersji 3.0) obsługuje uogólniony model wtrysku zależności, który jest zdefiniowany w standardzie JSR-330. (Google Guice Framework i Picocontainer framework również wspierają ten model).

Z @Inject można podać odniesienie do implementacja interfejsu Provider, który umożliwia wprowadzanie odwołań odroczonych.

Adnotacje @Inject i @Autowired - jest niemal kompletną analogią. Podobnie jak adnotacja @Autowired, adnotacja @Inject może być używana do automatycznego wiązania właściwości, metod i konstruktorów.

W przeciwieństwie do @Autowired adnotacja, @Inject adnotacja nie ma atrybutu required. Dlatego, jeśli zależności nie zostaną znalezione - zostanie wyrzucony wyjątek.

Istnieją również różnice w wyjaśnienia właściwości wiążących. Jeśli wybór składników do wstrzyknięcia jest niejednoznaczny, należy dodać kwalifikator @Named. W podobnej sytuacji dla @Autowired zostanie dodana adnotacja @Qualifier kwalifikator (JSR-330 definiuje własną adnotację @Qualifier i poprzez ten kwalifikator zostanie zdefiniowana adnotacja @Named).

 12
Author: Aleksey Bykov,
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-08-26 14:20:23

@Inject nie posiada atrybutu "required"

 11
Author: Mykhaylo Adamovych,
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-04-27 12:10:49

Lepiej używać @Inject cały czas. Ponieważ to podejście java configuration (dostarczone przez sun) sprawia, że nasza aplikacja jest agnostyczna dla frameworka. Więc jeśli wiosna również zajęcia będą działać.

Jeśli używasz @Autowired, to będzie działać tylko ze sprężyną, ponieważ @ Autowired jest adnotacją podaną przez sprężynę.

 11
Author: tech.yenduri,
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-11-26 17:27:37

Oprócz powyższego:

  1. domyślnym zakresem dla @ Autowired Beans jest Singleton, podczas gdy używanie adnotacji JSR 330 @Inject jest podobne do adnotacji Springa prototype.
  2. nie ma odpowiednika @Lazy w JSR 330 używając @ Inject
  3. nie ma odpowiednika wartości @w JSR 330 przy użyciu @ Inject
 9
Author: Keyur Vyas,
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-06-22 04:22:03

Adnotacja @Inject jest jedną z kolekcji adnotacji JSR-330. To ma dopasowanie według typu, dopasowanie według kwalifikatora, dopasowanie według nazwy ścieżki realizacji. Te ścieżki wykonania są ważne zarówno dla settera, jak i field injection.Zachowanie adnotacji @Autowired jest takie samo jak adnotacji @Inject. Jedyną różnicą jest to, że adnotacja @Autowired jest częścią frameworka Spring. @Autowired adnotacja ma również powyższe ścieżki wykonania. Więc polecam @Autowired za odpowiedź.

 0
Author: Kushani Jayawardane,
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-04-11 10:47:31