Ласкаво просимо у світ Spring Boot! У попередніх лекціях ми обговорили фундаментальні концепції Spring Framework, дізналися, що таке Spring Boot і як він спрощує життя Java-розробникам. Сьогодні зануримось у практику і зробимо наш перший крок зі створення й запуску Spring Boot-застосунку. Готові? Тоді вперед — до наших перших рядків коду і гарячих запусків серверів!
Структура проєкту в Spring Boot — це не просто хаотична купа директорій. Вона зроблена для того, щоб організувати код так, щоб було легко працювати як з невеликими скриптами, так і з великими enterprise-системами.
Знання структури проєкту допомагає:
- Швидше знаходити потрібні файли і налаштування.
- Розуміти, де що лежить (навіть через роки роботи над проєктом).
- Підготувати проєкт до масштабування (щоб додати ще одну фічу було не страшно).
Структура Spring Boot-проєкту
Коли ви створюєте Spring Boot-проєкт (наприклад, через Spring Initializr), вам автоматично дають базову структуру. Ось приблизно така:
my-spring-boot-app/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/example/demo/
│ │ │ ├── MySpringBootApplication.java // Головний клас застосунку
│ │ │ └── controllers/
│ │ │ └── HelloController.java // Наші контролери
│ │ ├── resources/
│ │ ├── application.properties // Конфігурації застосунку
│ │ └── static/ // Статичні ресурси (CSS, JS тощо)
│ └── test/ // Тести застосунку
├── pom.xml (або build.gradle) // Конфігурація залежностей Maven/Gradle
Розберемо основні елементи:
src/main/java/
Уся ваша бізнес-логіка буде знаходитися тут. Наприклад, контролери, сервіси, репозиторії та інші «розумні» класи.src/main/resources/
Тут зберігаються конфігурації (наприклад,application.properties), ресурси (наприклад, статичні файли) та шаблони для рендерингу сторінок (якщо використовуєте Thymeleaf).src/test/
Тека для тестів. Ми поки що туди лізти не будемо, але згодом це стане нашим найкращим другом.pom.xml або build.gradle
Файл, який відповідає за управління залежностями вашого проєкту. Тут додаємо потрібні залежності, наприклад,spring-boot-starter-web.
Головний клас застосунку
Головний клас застосунку — це стартова точка при запуску Spring Boot-проєкту. Зазвичай цей клас лежить у src/main/java і містить всього кілька рядків. Ось приклад коду:
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}
Що тут відбувається?
@SpringBootApplication: ця анотація поєднує в собі три інші (@Configuration,@EnableAutoConfiguration,@ComponentScan) і каже Spring Boot: "Ей, це наш головний клас. Починай звідси!".SpringApplication.run(): запускає в дію "Spring Boot magic". Знаходить всі конфігурації, стартує вбудований сервер і починає слухати вхідні запити.
Де шукати наш код? Ідеально, коли головний клас знаходиться прямо в корені вашого пакета, наприклад, com.example.demo. Це спрощує автоматичне сканування всіх класів проєкту. Якщо вирішите сховати головний клас глибше, може знадобитися ручне налаштування сканування компонентів (спойлер: не робіть так без реальної потреби).
Роль файлу application.properties
Якщо головний клас — це серце вашого застосунку, то application.properties (або його YAML-версія — application.yml) — його мозок. Тут задаються конфігурації, такі як порт, налаштування бази даних, логування та багато іншого.
Приклад налаштувань у application.properties:
# Порт сервера
server.port=8081
# Логування
logging.level.org.springframework=DEBUG
logging.level.com.example=TRACE
Запустіть застосунок, і він буде слухати на порту 8081 замість стандартного 8080! Якщо хочете YAML-версію, ось як це виглядатиме:
server:
port: 8081
logging:
level:
org.springframework: DEBUG
com.example: TRACE
Запуск застосунку
Spring Boot дає чудовий комфорт з точки зору запуску. Ось як це робиться:
Запуск з IDE
- Відкрийте ваш проєкт в IntelliJ IDEA (або іншій IDE).
- Знайдіть головний клас застосунку.
- Клікніть на зелену кнопку "Run" поруч із методом
main.
- Запуск через термінал. Виконайте одну з команд:
або
./mvnw spring-boot:run./gradlew bootRun - Створення jar-файлу. Зібрати jar для вашого застосунку можна так:
./mvnw clean packageПісля цього запустіть jar-файл:
java -jar target/my-app-0.0.1-SNAPSHOT.jar
Перевірка роботи
Тепер відкрийте браузер і введіть:
http://localhost:8080/hello
Якщо ви бачите повідомлення "Hello, World", значить усе працює як треба! Ура!
Практика
Давайте створимо найпростішу програму, яка повертає привітання. Використаємо контролер для обробки запиту.
Розглянемо код контролера:
package com.example.demo.controllers;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, World from Spring Boot!";
}
}
Що тут відбувається?
@RestController: каже Spring, що цей клас буде обробляти HTTP-запити.@GetMapping: означає, що метод оброблятиме HTTP GET-запити за адресою/hello.- String-відповідь: повертаємо просте текстове привітання клієнту.
Перевіримо відповідь
Відкрийте браузер або Postman, зверніться до http://localhost:8080/hello і насолоджуйтеся своїм першим Spring Boot-контролером!
Поширені помилки при запуску
Spring Boot робить багато за вас, але іноді виникають помилки. Ось кілька типових проблем і їхні рішення:
- Порт вже зайнятий
При запуску ви бачите повідомленняPort 8080 is already in use. Це означає, що хтось уже "захопив" порт. Спробуйте поміняти порт уapplication.properties:server.port=8081 - Неправильна структура пакетів
Якщо головний клас застосунку (з анотацією@SpringBootApplication) знаходиться не в корені пакета, це може викликати проблеми зі скануванням компонентів. - Помилка автоконфігурації
Якщо ви забули підключити потрібний "стартер" (наприклад,spring-boot-starter-web), застосунок не зможе обробляти запити. Перевірте вашpom.xmlабоbuild.gradle.
На цьому етапі ви вже готові створювати і запускати Spring Boot-застосунки. У наступній лекції поговоримо про життєвий цикл бинів і дізнаємося, як Spring керує нашими об'єктами зсередини. Хто сказав, що магія — це складно? 😉
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ