Spring Flashcards
Co to jest Spring IoC Container?
- kontener leżący u podstaw Springa
- odpowiedzialny za** tworzenia, konfigurowanie i zarządzanie cyklem życia beanów**
- wykorzystuje Dependency Injection do zarządzania różnymi komponentami aplikacji Spring
Jakie są główne funkcje Spring IoC Container?
- Tworzenie Obiektów
- Wstrzykiwanie Zależności
- Zarządzanie Cyklem Życia
- Konfiguracja
- Aspektowe Programowanie (AOP)
- Usługi Kontenera
akie są główne implementacje kontenera IoC w Springu?
- ApplicationContext — zapewnia dodatkową funkcjonalność. Jest zbudowany na interfejsie BeanFactory.
- BeanFactory — wstępnie zapakowana klasa zawierająca kolekcję beanów. Tworzy instancję beana, gdy jest to wymagane przez klientów
Co umożliwia Aspektowe Programowanie (AOP) w kontekście Spring IoC Container?
Umożliwia przecinanie i rozwinięcie funkcjonalności beanów, pozwalając na dodanie dodatkowego zachowania do komponentów bez modyfikowania ich głównego kodu.
Jakie są zalety IoC (odwrócenie kontroli)?
- Separacja zależności od logiki biznesowej.
- Elastyczność konfiguracji zależności.
- Promocja “Single Responsibility Principle”.
- Ułatwienie testowania dzięki wstrzykiwaniu zależności.
- Odkładanie inicjalizacji obiektów.
- Zarządzanie cyklem życia obiektu przez kontener.
- Promocja luźnego powiązania (loose coupling) komponentów.
- Jednolita konfiguracja zależności w całej aplikacji.
- Wsparcie dla aspektowego programowania (AOP).
Jakie są główne zalety Spring Framework? (
- Wstrzykiwanie Zależności: Ułatwia modularność i testowalność dzięki kontenerowi IoC.
- Wszechstronność: Szeroki zakres modułów, od bezpieczeństwa po integrację z chmurą.
-
Integracja z Istniejącymi Technologiami: Łatwa integracja z technologiami takimi jak Hibernate, JPA, JMS.
4.** Zabezpieczenia**: Kompleksowe rozwiązania dzięki Spring Security. - Programowanie Aspektowe (AOP): Oddzielenie logiki biznesowej od przekrojowej.
@Component
- Oznacza klasę jako komponent Springa.
- Informuje kontener Springa, że klasa ma być zarejestrowana jako bean.
- jest używana do oznaczania klas w Springu, które mają zostać automatycznie wykryte przez skanowanie komponentów.
- spring tworzy instancje klasy w application context
- pochodne @Service , @Repository
Do czego służy @Autowired?
Umożliwia automatyczne wstrzykiwanie zależności (beanów) w komponencie Springa.
- gdy Spring Boot się włącza skanuje context w poszukiwaniu beanów które mają zależnośći i łaczy ze sobą , dzięki temu componenty są decoupled
- może być używany na konstrutkorze, setterach i fieldach
Jak działa adnotacja @Service?
Oznacza klasę jako serwis w architekturze Springa. Jest to specjalny typ @Component przeznaczony dla warstwy serwisów.
Co oznacza @Repository w Springu?
Oznacza klasę jako repozytorium, czyli komponent odpowiedzialny za operacje na bazie danych. Jest to specjalny typ @Component.
@Controller
- Oznacza klasę jako kontroler w Spring MVC.
- klasa również staje się beanem
- Kontroler obsługuje żądania użytkownika i zwraca odpowiedź.
Czym jest @RestController?
- Jest to połączenie @Controller i @ResponseBody.
- Używany w aplikacjach RESTful, gdzie odpowiedź jest zazwyczaj w formacie** JSON lub XML.**
Do czego służy @RequestMapping?
Definiuje adres URL, pod którym dany kontroler lub metoda kontrolera będzie dostępna.
@RestController public class ExampleController { @RequestMapping(value = "/hello", method = {RequestMethod.GET, RequestMethod.POST}) public String multipleMethodsHello() { return "Hello from either GET or POST request!"; } }
Jak działa adnotacja @Value?
Umożliwia wstrzykiwanie wartości z plików konfiguracyjnych do pól w komponencie Springa.
Czym jest @Qualifier?
Umożliwia dokładne określenie, który bean ma zostać wstrzyknięty, gdy istnieje kilka kandydatów.
Jakie jest zastosowanie @Transactional?
- Oznacza, że metoda ma być wykonana w kontekście transakcji.
- Używane głównie w warstwie serwisów do operacji na bazie danych.
@Bean
Używana w klasach konfiguracyjnych do wskazywania metod, które produkują beany do zarządzania przez kontener Springa.
@Configuration
Oznacza klasę jako źródło definicji beanów. Klasa taka może zawierać metody oznaczone** @Bean**.
@Scope
Określa zakres beanu. Możliwe wartości to: “singleton”, “prototype”, “request”, “session” i “application”.
@PostConstruct:
Oznacza metodę, która ma zostać wykonana po utworzeniu beanu, ale przed jego użyciem.
@PreDestroy
Oznacza metodę, która ma zostać wykonana przed zniszczeniem beanu przez kontener.
@PathVariable
Używana w Spring MVC do wiązania wartości segmentu ścieżki URL z parametrem metody.
@RequestBody
Używana w Spring MVC do wskazania, że argument metody powinien być deserializowany z ciała żądania HTTP.
@RequestParam
Wiąże wartość parametru żądania z parametrem metody w kontrolerze Spring MVC.
@ComponentScan
żywana w klasach konfiguracyjnych do wskazania pakietów, które mają zostać przeskanowane w poszukiwaniu komponentów Springa.
@Profile
Określa, w jakich profilach dany bean lub konfiguracja powinny być aktywne.
Adnotacje mapaowania żadań HTTP
@GetMapping: Mapuje żądania HTTP GET na konkretną metodę.
@PostMapping: Mapuje żądania HTTP POST.
@PutMapping: Mapuje żądania HTTP PUT.
@DeleteMapping: Mapuje żądania HTTP DELETE.
@RequestMapping: Ogólna adnotacja do mapowania żądań; można ją używać z różnymi typami żądań (GET, POST, PUT itp.), określając odpowiedni atrybut method.
jakie znasz Bean Scope w Springu
- Singleton – Instancja beana będzie tylko raz i ta sama instancja zostanie zwrócona przez kontener IOC. Jest to zakres domyślny.
- Prototype – nowa Instancja beana zostanie utworzona za każdym razem na żądanie.
- Request – Instancja bean zostanie utworzona na żądanie HTTP.
- Session – Instancja bean zostanie utworzona na sesję HTTP.
- Global session – Instancja bean zostanie utworzona podczas globalnej sesji HTTP.
Co to jest Spring MVC?
Spring MVC to moduł frameworka Spring zaprojektowany do tworzenia aplikacji internetowych, opierający się na wzorcu projektowym Model-View-Controller (MVC).
Na jakie trzy główne komponenty dzieli się wzorzec MVC w Spring MVC?
Widok - JSP, Thymeleaf, FreeMarker i inne.
Model - Reprezentuje dane aplikacji, często są to zwykłe obiekty Java (POJOs).
Kontroller - Obsługuje żądania użytkownika, interakcje z modelem i zwraca odpowiedni widok.
Sposoby wstrzykiwania beana
Wstrzykiwanie przez konstruktor zalety i wady
Wstrzykiwanie przez konstruktor: Jest to obecnie zalecany sposób wstrzykiwania beanów w Springu, zwłaszcza gdy bean ma wymagane zależności.
Zalety:
1. Nie można stworzyć obiektu bez wymaganych zależności.
2. Beany są niemutowalne po ich utworzeniu, co zwiększa bezpieczeństwo.
3. Promuje wzorzec projektowy jednej odpowiedzialności, ponieważ duże ilości argumentów konstruktora mogą sugerować, że klasa ma zbyt wiele zależności.
Wady:
W przypadku wielu zależności konstruktor może stać się mniej czytelny.
Wstrzykiwanie przez setter zalety i wady
Wstrzykiwanie przez setter: Używane, gdy zależności są opcjonalne.
Zalety:
1. Umożliwia ustawianie zależności po utworzeniu obiektu.
2. Zwiększa elastyczność, ponieważ pozwala na dynamiczną zmianę zależności w czasie wykonywania.
Wady:
1. Może prowadzić do niezainicjowanych zależności, jeśli setter nie zostanie wywołany.
2. Większe ryzyko mutacji stanu obiektu.
Wstrzykiwanie przezpole
Wstrzykiwanie przez pole: Jest to najprostszy sposób wstrzykiwania, ale jest rzadziej zalecany.
Zalety:
Minimalna ilość kodu.
Wady:
1. Trudniejsze w testowaniu jednostkowym, ponieważ wymaga użycia refleksji do ustawienia prywatnych pól.
2. Może prowadzić do niemożliwych do zidentyfikowania błędów w przypadku braku odpowiedniej zależności.
Jak działa Spring Boot
Spring Boot jest rozszerzeniem frameworku Spring, które ma na celu ułatwienie tworzenia aplikacji opartych na Springu poprzez:
- Auto-konfigurację: Automatycznie konfiguruje aplikację na podstawie dostępnych zależności.
- Startery: Zapewnia zestawy zależności, które można włączyć do projektu, ułatwiając integrację różnych komponentów Springa.
-
Osadzony serwer: Domyślnie dostarcza osadzone wersje popularnych serwerów, takich jak Tomcat, dzięki czemu można uruchamiać aplikacje bez zewnętrznego serwera.
4.** Wskaźniki stanu zdrowia i metryk**i: Wbudowane narzędzia do monitorowania i zarządzania aplikacją. - Opinia: Zamiast oferować konfigurację na wszystko, Spring Boot oferuje większość “najlepszych praktyk” jako domyślną konfigurację, co ułatwia szybkie rozpoczęcie pracy.
Co robi adnotacja @SpringBootApplication w Spring Boot?
Adnotacja @SpringBootApplication jest wygodną adnotacją, która łączy trzy inne adnotacje:
- @Configuration: Wskazuje, że klasa może używać metody opartej na @Bean do definiowania beanów dla kontekstu aplikacji.
- @EnableAutoConfiguration: Włącza mechanizm auto-konfiguracji Spring Boot, który próbuje automatycznie konfigurować aplikację na podstawie dostępnych zależności.
- @ComponentScan: Umożliwia skanowanie komponentów, serwisów, kontrolerów itp. od bieżącego pakietu.
różnice między @RequestMapping a @GetMapping:
Co to jest wstrzykiwanie zależności (Dependency Injection)?
Technika w programowaniu obiektowym, która polega na dostarczaniu zależności do komponentu zamiast pozwolić komponentowi samemu je tworzyć lub szukać.
Jest kluczowym elementem inwersji kontroli (IoC) i jest stosowane w ramach frameworków IoC, np. Spring.
Przykład tradycyjnego tworzenia zależności vs. wstrzykiwania zależności.
Zalety Dependency Injection
-
Oddzielenie odpowiedzialności:
-Zamiast komponentu tworzenia i zarządzania jego zależnościami, te zależności są “wstrzykiwane” z zewnątrz. -
Testowalność:
- łatwo jest podmieniać rzeczywiste implementacje zależności mockami lub innymi wersjami implementacji podczas testowania jednostkowego. - Konfiguracja i kod: - konfiguracja i logika biznesowa są oddzielone, co czyni kod bardziej modularnym i łatwiejszym do zarządzania.
4.Elastyczność i łatwość
- można konfigurować i zarządzać zewnętrznie, co umożliwia łatwą zmianę zależności bez modyfikacji kodu źródłowego.
różnice między adnotacjami @RestController i @Controller
@Controller w Spring MVC.
W jaki sposób w Springu można przechwytywać wyjątki na poziomie kontrolera?
- Gdy metoda getUser rzuci wyjątek UserNotFoundException, Spring automatycznie przekieruje przetwarzanie do metody handleUserNotFound.
- Adnotacja @ExceptionHandler(UserNotFoundException.class) wskazuje, że metoda handleUserNotFound ma być wywołana tylko wtedy, gdy w tym kontrolerze zostanie rzucony wyjątek UserNotFoundException.
- Adnotacja @ResponseStatus(HttpStatus.NOT_FOUND) określa, że odpowiedź HTTP powinna mieć kod statusu 404 (Not Found).
Metoda handleUserNotFound zwraca wiadomość z wyjątku jako odpowiedź.
Jak obsłużyć globalnie wszystkie wyjątki w aplikacji Spring?
- Klasa GlobalExceptionHandler jest opatrzona adnotacją @ControllerAdvice, co oznacza, że będzie ona obsługiwać wyjątki dla wszystkich kontrolerów w aplikacji.
- Adnotacja @ExceptionHandler(UserNotFoundException.class) wskazuje, że metoda handleUserNotFound ma być wywołana w przypadku wystąpienia wyjątku UserNotFoundException w dowolnym kontrolerze w aplikacji.
- Adnotacja @ResponseStatus(HttpStatus.NOT_FOUND) określa, że odpowiedź HTTP powinna mieć kod statusu 404 (Not Found).
Metoda handleUserNotFound zwraca wiadomość z wyjątku jako odpowiedź.
@ResponseStatus
Adnotacja @ResponseStatus pozwala zdefiniować kod statusu HTTP i wiadomość, które mają zostać zwrócone, gdy określony wyjątek jest rzucany.
Jak zwrócić własny obiekt odpowiedzi w przypadku błędu w Spring?
Można skonstruować odpowiedź manualnie, korzystając z klasy **ResponseEntity<T>.** Można ustawić status, nagłówki i ciało odpowiedzi według własnych potrzeb.</T>
BeanFactory vs ApplicationContext
BeanFactory
- Jest to podstawowy kontener do tworzenia i zarządzania beanami.
- ładuje beany leniwie
- leżejszy od applicationContext
- dobry gdzie zasoby ograniczone i potrzeba jest prosta kontrola nad beanami
ApplicationContext
- rozszerza bean factory i dodaje więcej funkcji
- ładuje beany z góry przy uruchomieniu
- jest bardzej zaawansowany
- obsługuje internacjonalizację
Co robi @ModelAttribute gdy jest stosowana na metodzie kontrolera w Spring?
- powoduje, że wynik tej metody jest automatycznie dodawany do modelu.
@ModelAttribute w Parametrach Metody
- Spring tworzy obiekt odpowiadający typowi argumentu, następnie bindowanie danych żądania HTTP do atrybutów tego obiektu.
Cel @ModelAttribute
ma za zadanie ułatwić pracę z danymi modelu, automatyzować bindowanie danych formularzy do obiektów domenowych oraz pozwalać na przechowywanie danych między żądaniami HTTP.
@ResponseBody
- wskazuje, że wartość zwracana przez metodę powinna być użyta jako treść (body) odpowiedzi HTTP.
- Kiedy metoda kontrolera jest oznaczona adnotacją @ResponseBody, Spring automatycznie konwertuje obiekt zwracany przez tę metodę na format JSON, XML lub inny format zależny od konfigurac
Profile w springu
- pozwalają na określenie różnych zestawów beanów i konfiguracji, które mają być aktywne w określonych warunkach.
Dzięki temu można łatwo przełączać się między różnymi konfiguracjami bez zmiany kodu. - ## możesz mieć różne konfiguracje bazy danych dla środowisk deweloperskiego i produkcyjnego, lub chcesz włączyć pewne beany tylko podczas testowania.
Jak właczyć profile ?
- Poprzez Ustawienia VM (JVM)
java -jar -Dspring.profiles.active=dev,application.jar
- W Plikach Konfiguracyjnych application.properties
spring.profiles.active=dev,test
Czym jest AOP
- programowanie zorientowane aspektowo
- pozwala oddzielić pewne fragmenty kodu od siebie
- poprawia modularność tworzonego kodu
- pozwala wprowadzić dodatkową warstwę kodu i ta warstwa jest wyraźnie odseparowana od właściwego kodu
Głowne koncepty AoP
- Aspekty - moduły zawierające powiązany kod z konkretnymi operacjami np. logowanie, zarządzanie transkacjami
- Przecięcia (Join Points) - miejsce w aplikacji gdzie aspekt może zostać zastosowany np. metoda
- Porady (advices) akcje podejmowane przez aspekt w punkcie przecięcia (np. before, after)
- Pointcut - wyrażenie, które definiuje w których punktach przecięcia aspekt powinien być zastosowany np. wszystkie metody w określonej klasie
- wiązanie - proces zastosowanie aspektu w określonych punktach w czasie rwyknoywania
Przykłady AoP
- transkacje bazodanowe w springu
- loggery
- security
Jak uruchomić aspekty ze Spring AoP
- AspectJ
- w głównej klasie
@EnableAspectJAutoProxy(proxyTargetClass=true)
Jak korzystać ze Spring AoP
- @Aspect i @Component
- @Around uruchomienia apektu dookoła wywołania metody (jako parametr zawiera poincat)
- Nazwa metody jest dowolna, jako parametr przyjmuje ona ProceedingJoinPoint, czyli miejsce w którym następuje wywołanie metody lub rzucenie wyjątku
- od, który chcemy wykonać przed wywołaniem metody
- Właściwe wywołanie metody\
- Kod, który chcemy wykonać po uruchomieniu metody.
- Zwrócenie wyniku z danej metody.
Zarządzanie transakcjami w springu
- spring pozwala na kontrolowanie transkacji bazodanowych w spójny deklaratywny sposób
- @Transactional
- interfejs PlatformTransactionManager
- interfejsy TransactionDefinition and TransactionStatus:
@Transactional
- określa granice transakcji na poziomie metod lub klas bez konieczności ręcznego sterowania transkacjami
- dana metoda wykonywana w ramach transkacji w razie wyjątku zostanie zrobiony rollback
- pozwala na określenie polityk propagacji i pozimów izolacji
@Transactional(isolation = Isolation.READ_COMMITTED, timeout = 30)
- nie określając poziomu izolacji będzie domyślna jak w silniku bazy danych
PlatformTransactionManager
- interfejs który definiuje ogólny sposób na zarządzanie transkacjami
- umożliwe abstrahowanie od konkretnego mechanizmu zarządzania transkacjami , co pozwala łatwa zmianę technologii dostępu do danych
- ## getTransaction(), commit, rollback
Jak zarządzać security w spring boot
- Spring security framework
- klasa SecurityConfig z @Configuration, @EnableWebSecurity
- możesz używać standardowego flow authentykacji tzn. AuthenticationManager -> AuthProvider -> UserDetailsService
- można użyć także OAuth2 oraz JWT
Czym jest JWT
- kompaktowy, bezpieczny sposób reprezentacji roszczeń (claims) do przesyłania między dwoma stronami.
- składa się : nagłówka (header), ładunku (payload) i podpisu (signature). Części te są kodowane Base64 i rozdzielone kropkami.
- nagłówek zawiera informacje o typie tokenu i algorytmie szyfrującym
- ładunek zawiera roszczenia , uprawnienia
- podpis - Utworzony przez zakodowanie nagłówka, ładunku i tajnego klucza algorytmem podanym w nagłówku.
Użycie JWT w Spring
Jak aktywować profile w Spring boot
spring.profiles.active=dev
jak uruchomić jak w env variables ?
Jakie są minusy na dostarczanie propertisow z CLI, JVM oraz ENV ?
- wymagają różnych komend - problem przy deploymencie (CI/CD pipline)
- wiele mikroserwisów - wiele propertisów
- brak kontroli dostępu do danych konfiguracyjnych
- brak encryption
- każda zmiana wymaga restartu aplikacji, kontenera
Czym jest Spring Boot Actuator
- narzędzie do monitorowania i zarządzanie aplikacjami w czasie rzeczywistym
- endpointy monitorujące = **health, metrics, info ,env **
- zbiera metryki - zużycie pamięci, procesora, metryki http
- ## można zintegrować z grafana itd
O czym trzeba pamiętać przy poziomie propagacji i @Transactional ?
- @Transactional Spring tworzy proxy wokół beana aby zarządzać transkacjami
- proxy działa wtedy gdy wywołanie następuje z zewnątrz tego beana,
- jeśli metoda w tym beanie wywołuje inna metodę w tym beanie, która również @Transactional to wywołanie nie przechodzi przez proxy i nie są stosowane zasady propagacji
Poziomy propagacji
- Required -> spring sprawdza czy istnieje aktywna transkacja, jeśli nie tworzy ją i wykonuje w transkacji.
- Supports - sprawdza czy istnieje transkacja. Jeśli tak to jest wykorzystywana a jak nie to logika wykonana poza transkacją.
- Mandatory - sprawdza czy istnieje i wykonuje a jak nie istnieje to rzuca wyjątek
- Never - rzuca wyjątek jak nie istnieje\
- Requires_NEW - przerywa aktywną transkacje i tworzy nową
- Not_supported jeśli istnieje przerywa i wykonuje poza transkacją