TL; DR
Adnotacja @Autowired oszczędza potrzeby samodzielnego wykonywania okablowania w pliku XML (lub w jakikolwiek inny sposób) i po prostu znajduje dla Ciebie to, co należy wstrzyknąć, i robi to za Ciebie.
Pełne wyjaśnienie
@Autowired
Adnotacji pozwala pominąć konfiguracje gdzie indziej co do wstrzyknięcia i po prostu robi to za ciebie. Zakładając, że Twój pakiet wymaga com.mycompany.movies
umieszczenia tego znacznika w pliku XML (plik kontekstowy aplikacji):
<context:component-scan base-package="com.mycompany.movies" />
Ten tag wykona automatyczne skanowanie. Zakładając, że każda klasa, która musi stać się fasolą, jest opatrzona adnotacją z poprawną adnotacją, taką jak @Component
(dla prostej fasoli) lub @Controller
(dla kontroli serwletu) lub @Repository
(dla DAO
klas) i te klasy znajdują się gdzieś w pakiecie com.mycompany.movies
, Spring znajdzie je wszystkie i utworzy fasola dla każdego. Odbywa się to w 2 skanach klas - za pierwszym razem po prostu wyszukuje klasy, które muszą stać się fasolą, i mapuje zastrzyki, które musi wykonać, a przy drugim skanie wstrzykuje ziarna. Oczywiście możesz zdefiniować swoje fasole w bardziej tradycyjnym pliku XML lub za pomocą klasy @Configuration (lub dowolnej kombinacji tych trzech).
@Autowired
Adnotacja mówi Wiosna gdzie zastrzyk musi nastąpić. Jeśli zastosujesz metodę, setMovieFinder
która zrozumie (przedrostek set
+ @Autowired
adnotacja), że fasola musi zostać wstrzyknięta. W drugim skanie Spring szuka fasoli typu MovieFinder
, a jeśli ją znajdzie, wstrzykuje ją do tej metody. Jeśli znajdzie dwie takie fasole, dostaniesz Exception
. Aby tego uniknąć Exception
, możesz użyć @Qualifier
adnotacji i powiedzieć, która z dwóch ziaren ma wstrzyknąć w następujący sposób:
@Qualifier("redBean")
class Red implements Color {
// Class code here
}
@Qualifier("blueBean")
class Blue implements Color {
// Class code here
}
Lub jeśli wolisz zadeklarować ziarna w pliku XML, wyglądałoby to mniej więcej tak:
<bean id="redBean" class="com.mycompany.movies.Red"/>
<bean id="blueBean" class="com.mycompany.movies.Blue"/>
W @Autowired
deklaracji należy również dodać @Qualifier
informację, który z dwóch kolorów fasoli do wstrzyknięcia:
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}
Jeśli nie chcesz używać dwóch adnotacji ( @Autowired
i @Qualifier
), możesz użyć @Resource
tych dwóch:
@Resource(name="redBean")
public void setColor(Color color) {
this.color = color;
}
( @Resource
(Możesz przeczytać dodatkowe dane na ten temat w pierwszym komentarzu do tej odpowiedzi) oszczędza ci używania dwóch adnotacji, a zamiast tego używasz tylko jednej.
Dodam jeszcze dwa komentarze:
- Dobrą praktyką byłoby użycie
@Inject
zamiast tego, @Autowired
ponieważ nie jest ona specyficzna dla wiosny i jest częścią JSR-330
standardu .
- Inną dobrą praktyką byłoby umieszczenie
@Inject
/ @Autowired
na konstruktorze zamiast metody. Jeśli umieścisz go w konstruktorze, możesz sprawdzić, czy wstrzykiwane ziarna nie mają wartości zerowej i szybko zawodzą podczas próby uruchomienia aplikacji i unikają NullPointerException
sytuacji, w której trzeba użyć fasoli.
Aktualizacja : Aby uzupełnić obraz, stworzyłem nowe pytanie dotyczące @Configuration
klasy.