Przeglądam blogi na SpringSource, a na jednym z blogów autor używa @Inject
i przypuszczam, że on też może z niego korzystać @Autowired
.
Oto fragment kodu:
@Inject private CustomerOrderService customerOrderService;
Nie jestem pewien różnicy między @Inject
i @Autowired
doceniłbym to, gdyby ktoś wyjaśnił ich różnicę i którego użyć w jakiej sytuacji?
Odpowiedzi:
Zakładając, że masz na myśli
javax.inject.Inject
adnotacje.@Inject
jest częścią standardu Java CDI ( Contexts and Dependency Injection ) wprowadzonego w Javie EE 6 (JSR-299), czytaj więcej . Spring zdecydował się wspierać używanie@Inject
synonimów z ich własnymi@Autowired
adnotacjami.Tak więc, aby odpowiedzieć na twoje pytanie,
@Autowired
jest własna adnotacja Springa.@Inject
jest częścią nowej technologii Java o nazwie CDI, która definiuje standard wstrzykiwania zależności podobny do Springa. W aplikacji Spring te dwie adnotacje działają w taki sam sposób, jak Spring postanowił wesprzeć niektóre adnotacje JSR-299 oprócz własnych.źródło
@Inject
jest oddzielnym JSR (JSR-330) od CDI (JSR-299).@Inject
adnotacji JSR jest lepsze niż użycie tego,@Autowired
który blokuje bazę kodu za pomocą sprężyny DI.@Inject
pojedynkę nie zapewni niezależności ram. Można by też trzeba zadeklarować fasoli wstrzyknięć bez mechanizmów zależnych ramowych, takich jak sprężyny@Component
lubapplication.xml
, ale użytku@Named
i@Singleton
na poziomie klasy. Nie mam pojęcia, czy jakikolwiek projekt wiosenny tak naprawdę deklaruje dzisiaj taką fasolę - nigdy nie słyszałem o żadnym projekcie, który migrował z Spring do JEE ...Oto blogu , który porównuje
@Resource
,@Inject
i@Autowired
, i wydaje się zrobić całkiem wyczerpujące zadanie.Z linku:
Testy 2 i 7, w których autor odwołuje się, to odpowiednio „wstrzyknięcie według nazwy pola” i „próba rozwiązania problemu z komponentem bean przy użyciu złego kwalifikatora”.
Wniosek powinien zawierać wszystkie potrzebne informacje.
źródło
Aby poradzić sobie z sytuacją, w której nie ma okablowania, dostępne są fasole z
@Autowired
required
atrybutem ustawionym nafalse
.Ale podczas używania
@Inject
interfejs dostawcy działa z komponentem bean, co oznacza, że fasola nie jest wstrzykiwana bezpośrednio, ale z operatorem.źródło
Od wiosny 3.0 oferty sprężynowe wsparcie JSR-330 opisów wtrysku zależność (
@Inject
,@Named
,@Singleton
).Jest to osobny rozdział w dokumentacji wiosennego o nich, w tym porównań do ich odpowiedników wiosnę.
źródło
Kluczowa różnica (zauważona podczas czytania Spring Docs ) pomiędzy
@Autowired
i@Inject
polega na tym, że@Autowired
ma atrybut „wymagany”, podczas gdy @Inject nie ma atrybutu „wymagany”.źródło
@Autowired(required=false)
W prostych słowach: „required
Atrybut wskazuje, że właściwość nie jest wymagana do celów automatycznego okablowania, właściwość jest ignorowana, jeśli nie można jej automatycznie przypisać”.Lepiej używaj @Inject przez cały czas. Ponieważ to podejście do konfiguracji Java (dostarczone przez sun) sprawia, że nasza aplikacja jest agnostyczna w stosunku do frameworka. Więc jeśli wiosną, również twoje klasy będą działać.
Jeśli użyjesz @Autowired, będzie działał tylko ze sprężyną, ponieważ @Autowired jest opatrzony wiosną pod adnotacją.
źródło
@Autowired
adnotacja jest zdefiniowana w ramach Spring.@Inject
adnotacja to standardowa adnotacja zdefiniowana w standardowym „Dependency Injection for Java” (JSR-330) . Wiosna (od wersji 3.0) obsługuje uogólniony model wstrzykiwania zależności, który jest zdefiniowany w standardowym JSR-330. ( Ramy Google Guice i Picocontainer również obsługują ten model).Za pomocą
@Inject
można wstrzyknąć odniesienie do implementacjiProvider
interfejsu, co umożliwia wstrzyknięcie odroczonych odniesień.Adnotacje
@Inject
i@Autowired
- to prawie kompletne analogie. Oprócz@Autowired
adnotacji,@Inject
adnotacji można używać do automatycznego wiązania właściwości, metod i konstruktorów.W przeciwieństwie do
@Autowired
adnotacji,@Inject
adnotacja nie marequired
atrybutu. Dlatego jeśli zależności nie zostaną znalezione - zostanie zgłoszony wyjątek.Istnieją również różnice w wyjaśnieniach właściwości wiązania. Jeśli wybór komponentów do iniekcji jest niejasny,
@Named
należy dodać kwalifikator. W podobnej sytuacji do@Autowired
adnotacji zostanie dodany@Qualifier
kwalifikator (JSR-330 definiuje własną@Qualifier
adnotację i za pomocą tego kwalifikatora@Named
definiowana jest adnotacja ).źródło
@Inject
nie ma atrybutu „wymagany”źródło
W dodatku do powyższego:
@Autowired
ziaren to Singleton, natomiast przy użyciu@Inject
adnotacji JSR 330 jest to jak prototyp Springa .@Inject
.@Inject
.źródło
@Inject
Adnotacja jest zbioru JSR-330 adnotacje. Zawiera ścieżki realizacji typu Dopasuj według typu, Dopasuj według kwalifikatora, Dopasuj według nazwy. Te ścieżki wykonywania są poprawne zarówno dla setera, jak i wstrzykiwania w polu. Zachowanie@Autowired
adnotacji jest takie samo jak@Inject
adnotacja. Jedyną różnicą jest to, że@Autowired
adnotacja jest częścią struktury Spring.@Autowired
adnotacja ma również powyższe ścieżki wykonania. Więc polecam@Autowired
dla twojej odpowiedzi.źródło