You are on page 1of 4

Лабраторна 2

1. Поясніть значення наступних термінів:


- Inversion of Control (IoC) - інверсія керування — це шаблон, який використовується для
роз’єднання залежностей між рівнями та компонентами в системі.

- IoC container - бібліотека, фреймворк чи програма, яка дозволить спростити й автоматизувати


написання коду за допомогою підходу IoC на стільки, скільки це можливо.

- Dependency Injection (DI) є прикладом шаблону IoC, який допомагає усунути залежності в
коді.

- Dependency inversion principle – один із принципів SOLID. Говорить про те, що класи верхніх
рівнів не повинні залежати від класів нижніх рівнів. Обидва повинні залежати від абстракцій.

2. В чому полягає різниця між анотаціями @Component та @Bean? Опишіть переваги та недоліки
створення бінів за допомогою цих анотацій.
@Component – анотація рівня класу, яка використовується для позначення класу як біна у середовищі
Spring (подібно до @Service, @Controller, @Provider які її розширюють).
@Bean – анотація рівня методу. Використовується для ініціалізації поверненого методом значення як
бін у конфігураціях.
Bean дає змогу внести певну логіку у ініціалізацію біна (наприклад, можна створити абстрактний клас
на основі інтерфейсу), в той час як Component дозволяє помічати компоненти як біни прямо в класі,
що є більш компактним.

3. Чому слід уникати ін’єкцій залежностей напряму у поле біна?


Оскільки це послаблює принцип SRP. Ін’єкція напряму в поле дозволяє підключати велику кількість
залежностей, при чому код все ще маттиме хороший вигляд.
Більше того, це прив’язує код до Spring, і при використанні іншого IoC фреймворку ін’єкція не
працюватиме.

4. В яких випадках краще використовувати ін’єкції залежностей за допомогою конструкторів, а в яких


за допомогою сетерів?
Якщо при підключенні залежності потрібно також виконати логіку – сеттер. Якщо ні – конструктор.

5. В яких випадках краще використовувати біни типу singleton, а в яких prototype?


Singleton – бін, який створюється в єдиному екземплярі і передається туди, де його підключають як
залежність. Prototype – для кожної залежності ініціюється новий об’єкт.
Сінглтон підходить для stateless бінів, в той час як прототип – для stateful.

6. Чи можливе у Spring Framework створення циркулярних залежностей при ін’єкціях?


Spring знаходить такі залежності та не дає запустити застосунок у runtime, викидаючи помилку з
інформацією, де та які залежності утворюють коло.

7. Чи може бути в одному проекті кілька класів з реалізацією якогось інтерфейсу, якщо цей інтерфейс
використовується для ін’єкції залежностей? Може, якщо при цьому використовувати @Qualifier чи
@Primary

8. Чи може бін мати кілька методів, помічених анотацією @Autowired? Так (сетери).
9. Чи може бін мати кілька конструкторів, помічених анотацією @Autowired? Ні.

Лабраторна 3

Лабораторна 4

1. Поясніть різницю між вебзастосунками та RESTful вебсервісами.


Вебзастосунок – повноцінна аплікація з юзер-інтерфейсом. З іншого боку, REST API використовує
протокол HTTP незалежно від презентації та може однаково підтримувати десктоп клієнти, мобільні
клієнти, клієнти Flash/Flex тощо.

2. Які технології реалізації концепції сервісно-орієнтованої архітектури ви знаєте? Чим RESTful


вебсервіси відрізняються від інших підходів?
SOAP - використовує XML-повідомлення для автентифікації, авторизації та виконання віддаленого
коду.

GraphQL. У той час як REST зосереджується на ресурсах і забезпечує набір кінцевих точок навколо них,
щоб дозволити багато операцій, GraphQL зосереджується на даних. Це більше мова запитів, ніж
справжній API, хоча він також надає всі необхідні інструменти для доступу до запитуваних даних.

3. Поясніть особливості використання шаблону проектування Front Controller при реалізації


вебзастосунків та RESTful вебсервісів.
Забезпечує централізований механізм обробки запитів, щоб усі запити оброблялися одним
обробником. Spring MVC має єдиний контролер, DispatcherServlet, який забезпечує єдину точку входу
у веб-програму Spring.

4. Для реалізації якої чи яких операцій CRUD (create, read, update, delete) можуть використовуватися
такі методи протоколу HTTP як GET, POST, PUT, PATCH, DELETE? 
Get –read, post – create (server initializes PK or other field), put – create (passing PK), update (fully replace),
patch – update (partial editing), delete – delete.
5. Що означають поняття «безпечний» та «ідемпотентний» метод HTTP? Чи будь який безпечний
метод є ідемпотентним? Чи будь який ідемпотентний метод є безпечним?
Ідемпотентність – властивість методу, коли, незалежно від кількості його викликів, стан та результат
залишаться незмінними. Get, put, delete (при умові, що видалення неіснуючого не повертає помилку)
Безпечість – при виклику метода стан не зміниться (read only). GET.
6. В чому полягає різниця між анотаціями @Controller та @RestController?
RestController доповнює Controller анотацією ResponseBody, яка вказує, що значення, яке повертає
метод, має бути прив’язане до мережевого тіла відповіді.

7. В чому полягає різниця між анотаціями @GetMapping та @RequestMapping?


RequestMapping використовується для вказання одної url адреси для усіх методів контролера.
GetMapping – використовується для отримання методом get запитів.
8. В яких випадках можуть знадобитися анотації @RequestParam, @PathVariable, @RequestBody?
RequestParam – вказує на те, що ендпоінт приймає певний параметр запиту:
http://domain/api/v1/forecast/aggregated?startDate=2023-01-10
PathVariable - вказує на те, що ендпоінт приймає певний параметр із url шляху.
RequestBody – вказує на те, що ендпоінт приймає певний об’єкт як тіло запиту.
9. Для чого потрібен клас ResponseEntity?
ResponseEntity представляє відповідь HTTP, включаючи заголовки, тіло та статус. Тоді як
@ResponseBody розміщує повернуте значення у тіло відповіді ResponseEntity також дозволяє
додавати заголовки та код статусу.

10. Як за допомогою анотації @Valid здійснювати валідацію даних, які надходять від клієнта?
З допомогою @Valid та анотацій javax.validation.constraints можливо здійснювати валідацію об’єктів
вхідних даних прямо у методах контролера. Можливо валідувати як один, так і усі параметри метода.

Лабораторна 5

1. Поясніть різницю між JDBC та JdbcTemplate.

Шаблон Spring JDBC дозволяє автоматично очищати ресурси, напр. звільнити підключення до бази
даних. Шаблон Spring JDBC перетворює стандартні SQLExceptions JDBC у RuntimeExceptions. Це
дозволяє програмісту більш гнучко реагувати на помилки. Шаблон Spring JDBC також перетворює
повідомлення про помилки, характерні для постачальника, у більш зрозумілі повідомлення про
помилки.

2. Які переваги надає PreparedStatement у порівнянні зі звичайним Statement?


Statement використовуєься, якщо потрібно виконати DDL запит лише раз, не передаючи йому
параметри. Non-binary protocol.
PreparedStatement – може виконуватись кілька разів, отримувати параметри та виконувати будь-які
SQL запити. Binary protocol.
3. Поясніть різницю між методами execute(), executeQuery() та executeUpdate() класу
PreparedStatement.
executeQuery() - виконує SQL-запит у цьому об’єкті PreparedStatement і повертає об’єкт ResultSet,
згенерований запитом.

executeUpdate() – виконує DML (INSERT, UPDATE or DELETE, повертає кількість змінених заисів) або
такий запит SQL, який не повертає нічого (DDL).

execute() - виконує оператор SQL у цьому об’єкті PreparedStatement, який може бути будь-яким видом
оператора SQL. Деякі підготовлені оператори повертають кілька результатів - метод execute обробляє
ці складні оператори, а також простішу форму операторів, які обробляються методами executeQuery
та executeUpdate.

4. Чим відрізняються інтерфейси RowMapper<T> та ResultSetExtractor<T>?


Різниця між RowMapper і ResultSetExtrator полягає в тому, що з мапером ми маємо доступ до
повернутого рядка, тоді як з екстрактором ми можемо використовувати весь набір результатів. Отже,
якщо нам потрібно зіставити кілька рядків, повернутих із запиту, на один об’єкт, ми повинні
використовувати екстрактор, але в інших випадках буде достатньо мапера.

5. Для чого потрібен інтерфейс KeyHolder?

Інтерфейс для отримання ключів, зазвичай використовується для автоматично згенерованих ключів,
які потенційно повертаються операторами вставки JDBC. Реалізації цього інтерфейсу можуть містити
будь-яку кількість ключів. У загальному випадку ключі повертаються як список, що містить одну карту
для кожного рядка ключів.
6. Як працює декларативне керування транзакціями у Spring Framework?
Керування транзакціями у Spring працює завдяки принципу AoP (aspect oriented programming). Метод,
який потрібно виконати у транзакції обгортається проксі, яка, у випадку, якщо було отримано runtime
помилку, відкочує зміни.
Важливо мати на увазі, що якщо транзакційний компонент реалізує інтерфейс, за замовчуванням
проксі буде Java Dynamic Proxy. Це означає, що перехоплюватимуться лише зовнішні виклики методів,
які надходять через проксі. Будь-які виклики самостійного виклику не запускатимуть транзакції, навіть
якщо метод має анотацію @Transactional. Ще одне застереження щодо використання проксі-серверів
полягає в тому, що лише загальнодоступні методи мають бути анотовані @Transactional. Методи будь-
яких інших видимостей просто ігноруватимуть анотацію, оскільки вони не є проксі.

7. Що таке «transaction propagation»? Як обрати потрібний механізм поширення транзакцій? Який


механізм поширення транзакцій використовується за замовченням?
Поширення визначає межі транзакцій нашої бізнес-логіки. Spring вдається розпочати та призупинити
транзакцію відповідно до наших налаштувань поширення.

Required - Spring перевіряє, чи є активна транзакція, і якщо нічого не існує, створює нову. В іншому
випадку бізнес-логіка додається до поточної активної транзакції. Тип за замовчуванням.

Supports - Якщо транзакція існує, буде використано наявну транзакцію. Якщо транзакції немає, вона
виконується без транзакцій

Mandatory - якщо є активна транзакція, вона буде використана. Якщо немає активної транзакції, то
Spring повертає помилку.

Never -  Spring повертає помилку, якщо транзакція існує.

Not_Supported – якщо транзакція існує її переривають, а бізнес логіка виконується без неї.

Requires_new – якщо транзакція існує її переривають, а бізнес логіка виконується у новій транзакції.

You might also like