Spring pozwala na manualną oraz automatyczną rejestrację beanów. Do manualnej rejestracji zależności tworzymy własne configi (jak tutaj). Natomiast w celu automatycznej rejestracji, Spring udostępnia nam adnotacje zwane stereotypami.
Cześć
Dziś zajmiemy się omówieniem poszczególnych stereotypów. Kiedyś na rozmowie rekrutacyjnej dostałem również pytanie o stereotypy i kiedy ich używać, więc o tym też wspomnę.
W dzisiejszym artykule:
- Mechanizm wstrzykiwania zależności
- Stereotypy
- Różnice pomiędzy poszczególnymi adnotacjami
Mechanizm wstrzykiwania zależności
Podczas pierwszych wydań Springa, wszystkie używane beany były deklarowane w plikach XML. Dla większych projektów, gwałtownie stało się to trudnym zadaniem. Na szczęście ludzie od Springa dość gwałtownie rozpoznali problem. W późniejszych wersjach, dostarczone zostało wstrzykiwanie zależności przy pomocy andotacji i/lub konfiguracji opartej na Javie. Oznacza to, iż zamiast deklarowania beanów używając plików XML, możemy wstrzykiwać zależności poprzez adnotacje, które przy odpowiedniej konfiguracji zostaną automatycznie zaczytane przez Springa.
Aby włączyć automatyczną rejestrację beanów w przypadku czystego Springa, na klasie konfiguracyjnej należy dołączyć adnotację @ComponentScan. W przypadku projektu spring bootowego nie musimy niczego dodawać. Pakiety a zarazem klasy, znajdujące się pod klasą, która uruchamia naszą aplikację zostaną automatycznie zeskanowane. Jest to oczywiście zasługa adnotacji @SpringBootApplication, która pod spodem posiada @ComponentScan.
Stereotypy
Wiedząc już, iż Spring umożliwia nam wstrzykiwanie zależności dzięki adnotacji, jakich adnotacji należy używać? Adnotacje jakich możemy użyć nazywa się stereotypami, dlatego iż zostały one umieszczone w pakiecie stereotype. Adnotacje te pozwolą Springowi na zarejestrowanie nowego beana, ale trzeba uważać!
Uwaga uwaga – tak naprawdę jedyną adnotacją, która jest automatycznie wykrywana przez Springa jest adnotacja @Component! W praktyce jednak wygląda to tak, iż każda z adnotacji ’potomnych’ (@Controller, @Service, @Repository) dodaje adnotację @Component w swojej deklaracji. Wynikiem tego jest oczywiście to, iż nasze klasy są rejestrowane jak należy.
Różnice pomiędzy poszczególnymi adnotacjami
W tym podrozdziale omówimy każdą z wcześniej wspomnianych adnotacji.
- @Component – to ogólny stereotyp dowolnego komponentu zarządzanego przez Springa. o ile bean, który chcesz oznaczyć nie pasuje do żadnej innej kategorii to ta adnotacja będzie odpowiednia.
- @Repository – stereotyp dla warstw persystencji. Jedną z zalet korzystania z tej adnotacji jest to, iż ma ona włączone automatyczne tłumaczenie wyjątków. Wyjątki zgłaszane w klasach z adnotacją @Repository zostaną automatycznie przetłumaczone na podklasy DataAccessExeption Springa.
- @Service – stereotyp dla warstw usług. W klasach z tą adnotacją zawarta jest zwykle logika biznesowa aplikacji.
- @Controller – stereotyp dla warstw prezentacji (Spring MVC). DispatcherServlet będzie szukał adnotacji @RequestMapping w klasach, które są opatrzone adnotacjami dzięki @Controller, ale nie dzięki @Component. Często spotkasz się też prawdopodobnie z bardzo podobną adnotacją @RestController, która jest adekwatnie tym samym ale dodatkowo dokłada adnotacje @ResponseBody oraz automatycznie konwertuje odpowiedzi do formatu JSON/XML.
Podsumowanie
To wszystko o ile chodzi o adnotacje do wstrzykiwania zależności w Springu. Wszystkie z nich są używane do automatycznego wykrywania beanów Springowych i zasadniczo zapewniają tę samą funkcjonalność. Różnice pomiędzy poszczególnymi adnotacjami są minimalne ale istotne, np. @Controller czy @Repository. Jednak w przypadku adnotacji @Service oraz @Component, różnica polega tylko na semantyce.
Źródła:
- Difference between @Component, @Service, @Controller, and @Repository in Spring
- @Component and Further Stereotype Annotations
- What’s the difference between @Component, @Repository & @Service annotations in Spring?
Za tydzień
Nowy rok :). A co za tym idzie pierwszy post w miesiącu, a więc krótkie podsumowanie miesiąca. Myślę, iż zmieni się również format wypuszczania nowych artykułów w nowym roku, ale to już więcej opiszę za tydzień.