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
@AutowiredAdnotacji 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.moviesumieszczenia 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 DAOklas) 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).
@AutowiredAdnotacja mówi Wiosna gdzie zastrzyk musi nastąpić. Jeśli zastosujesz metodę, setMovieFinderktóra zrozumie (przedrostek set+ @Autowiredadnotacja), ż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ć @Qualifieradnotacji 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 @Autowireddeklaracji należy również dodać @Qualifierinformację, 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 ( @Autowiredi @Qualifier), możesz użyć @Resourcetych 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
@Injectzamiast tego, @Autowiredponieważ nie jest ona specyficzna dla wiosny i jest częścią JSR-330standardu .
- Inną dobrą praktyką byłoby umieszczenie
@Inject/ @Autowiredna 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ą NullPointerExceptionsytuacji, w której trzeba użyć fasoli.
Aktualizacja : Aby uzupełnić obraz, stworzyłem nowe pytanie dotyczące @Configurationklasy.