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
Podczas pierwszych wydań Springa, wszystkie używane beany były deklarowane w plikach XML. Dla większych projektów, szybko stało się to trudnym zadaniem. Na szczęście ludzie od Springa dość szybko rozpoznali problem. W późniejszych wersjach, dostarczone zostało wstrzykiwanie zależności przy pomocy andotacji i/lub konfiguracji opartej na Javie. Oznacza to, że 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ż, że Spring umożliwia nam wstrzykiwanie zależności za pomocą adnotacji, jakich adnotacji należy używać? Adnotacje jakich możemy użyć nazywa się stereotypami, dlatego że 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, że każda z adnotacji ’potomnych’ (@Controller, @Service, @Repository) dodaje adnotację @Component w swojej deklaracji. Wynikiem tego jest oczywiście to, że 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. Jeżeli 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, że 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 zazwyczaj logika biznesowa aplikacji.
- @Controller – stereotyp dla warstw prezentacji (Spring MVC). DispatcherServlet będzie szukał adnotacji @RequestMapping w klasach, które są opatrzone adnotacjami za pomocą @Controller, ale nie za pomocą @Component. Często spotkasz się też zapewne z bardzo podobną adnotacją @RestController, która jest właściwie tym samym ale dodatkowo dokłada adnotacje @ResponseBody oraz automatycznie konwertuje odpowiedzi do formatu JSON/XML.
Podsumowanie
To wszystko jeżeli 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ę, że zmieni się również format wypuszczania nowych artykułów w nowym roku, ale to już więcej opiszę za tydzień.
Jestem pod wrażeniem jakości artykułów na blog. Artykuły są skondensowane i logiczne. Tak trzymać. 🙂
super!