Spring Boot для Java: полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что такое Spring Boot и зачем он нужен?

Spring Boot — это фреймворк для создания Java-приложений, который является надстройкой над популярным Spring Framework. Его главная цель — максимально упростить и ускорить разработку production-grade приложений, избавляя разработчика от рутинной конфигурации.

Основные проблемы, которые решает Spring Boot:

  • Автоконфигурация: Фреймворк автоматически настраивает бины и компоненты на основе зависимостей, добавленных в проект. Вам не нужно вручную писать XML-конфигурации или Java-классы для настройки DataSource, JPA, Security и т.д.
  • Встроенный сервер: Приложения Spring Boot запускаются как самостоятельные JAR-файлы со встроенным Tomcat, Jetty или Undertow. Это избавляет от необходимости разворачивать WAR-файлы на внешнем сервере.
  • Production-ready: Из коробки предоставляет метрики, health checks, внешнюю конфигурацию через application.properties/yml.
  • Минимальная конфигурация: Стартовые зависимости (starters) группируют связанные библиотеки, чтобы вы могли добавить одну зависимость вместо десяти.

Spring Boot идеально подходит для создания микросервисов, REST API, веб-приложений, пакетной обработки данных и enterprise-систем.

Установка Spring Boot

Spring Boot не устанавливается через pip или npm. Это Java-фреймворк, который подключается как зависимость в системе сборки Maven или Gradle. Рекомендуемый способ начать работу — использовать Spring Initializr.

Вариант 1: Spring Initializr (рекомендуется)

  1. Перейдите на start.spring.io
  2. Выберите: Project (Maven), Language (Java), Spring Boot (последняя стабильная версия)
  3. Заполните метаданные: Group (например, com.example), Artifact (например, demo)
  4. Добавьте зависимости: Spring Web, Spring Data JPA, H2 Database (для примера)
  5. Нажмите "Generate" — скачается ZIP-архив с готовым проектом
  6. Распакуйте и откройте в IDE (IntelliJ IDEA, Eclipse, VS Code)

Вариант 2: Maven (ручная настройка)

Добавьте в pom.xml следующий код:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.0</version>
    <relativePath/>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Вариант 3: Gradle

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.0'
    id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

Быстрый старт: Hello World на Spring Boot

Создадим простое REST-приложение, которое возвращает "Hello, PythonLib!".

Шаг 1: Главный класс приложения

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

Шаг 2: REST-контроллер

package com.example.demo;

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, PythonLib!";
    }
}

Шаг 3: Запуск

Выполните команду в корне проекта:

mvn spring-boot:run

Или запустите DemoApplication.main() из IDE. После запуска откройте браузер и перейдите по адресу http://localhost:8080/hello. Вы увидите сообщение "Hello, PythonLib!".

Основные методы и аннотации Spring Boot

В Spring Boot ключевую роль играют аннотации (метаданные) и методы интерфейсов. Рассмотрим 10 наиболее важных.

1. @SpringBootApplication

Что делает: Комбинированная аннотация, которая включает @Configuration, @EnableAutoConfiguration и @ComponentScan. Помечает главный класс Spring Boot приложения.

Параметры: scanBasePackages — пакеты для сканирования компонентов (опционально).

Пример:

@SpringBootApplication(scanBasePackages = "com.example")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

2. @RestController

Что делает: Комбинация @Controller и @ResponseBody. Указывает, что класс является контроллером, и все его методы возвращают данные (JSON/XML) напрямую, а не представления (JSP/Thymeleaf).

Параметры: value — имя бина (опционально).

Пример:

@RestController
@RequestMapping("/api")
public class UserController {
    @GetMapping("/users")
    public List<User> getAllUsers() {
        return userService.findAll();
    }
}

3. @GetMapping, @PostMapping, @PutMapping, @DeleteMapping

Что делает: Аннотации для маппинга HTTP-методов на методы контроллера. Сокращенные версии @RequestMapping(method = RequestMethod.GET).

Параметры: value — URL-путь, produces — тип возвращаемых данных (например, "application/json").

Пример:

@RestController
@RequestMapping("/products")
public class ProductController {

    @GetMapping("/{id}")
    public Product getProduct(@PathVariable Long id) {
        return productService.findById(id);
    }

    @PostMapping
    public Product createProduct(@RequestBody Product product) {
        return productService.save(product);
    }

    @PutMapping("/{id}")
    public Product updateProduct(@PathVariable Long id, @RequestBody Product product) {
        return productService.update(id, product);
    }

    @DeleteMapping("/{id}")
    public void deleteProduct(@PathVariable Long id) {
        productService.deleteById(id);
    }
}

4. @PathVariable

Что делает: Извлекает значение из шаблона URL и связывает его с параметром метода.

Параметры: value — имя переменной в URL, required — обязательность (по умолчанию true).

Пример:

@GetMapping("/users/{userId}/orders/{orderId}")
public Order getOrder(
        @PathVariable("userId") Long userId,
        @PathVariable("orderId") Long orderId) {
    return orderService.findByUserAndOrder(userId, orderId);
}

5. @RequestParam

Что делает: Извлекает параметры из строки запроса (query string) и связывает с параметрами метода.

Параметры: value — имя параметра, required — обязательность, defaultValue — значение по умолчанию.

Пример:

@GetMapping("/search")
public List<Product> searchProducts(
        @RequestParam("q") String query,
        @RequestParam(value = "page", defaultValue = "0") int page,
        @RequestParam(value = "size", defaultValue = "20") int size) {
    return productService.search(query, page, size);
}

6. @RequestBody

Что делает: Автоматически десериализует тело HTTP-запроса (JSON/XML) в Java-объект.

Параметры: required — обязательность тела запроса.

Пример:

@PostMapping("/users")
public User createUser(@RequestBody @Valid User user) {
    return userService.save(user);
}

7. @Service

Что делает: Помечает класс как сервисный компонент бизнес-логики. Spring автоматически создает бин этого класса и внедряет его в другие компоненты.

Параметры: value — имя бина (опционально).

Пример:

@Service
public class UserService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public List<User> findAll() {
        return userRepository.findAll();
    }
}

8. @Repository

Что делает: Помечает класс как репозиторий для работы с базой данных. Spring Data JPA автоматически реализует CRUD-методы для интерфейсов, расширяющих JpaRepository.

Параметры: value — имя бина (опционально).

Пример:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByLastName(String lastName);
    
    @Query("SELECT u FROM User u WHERE u.email = ?1")
    Optional<User> findByEmail(String email);
}

9. @Autowired

Что делает: Автоматическое внедрение зависимостей (DI). Spring находит подходящий бин и передает его в поле, конструктор или метод.

Параметры: required — обязательность наличия бина.

Пример:

@RestController
public class OrderController {
    private final OrderService orderService;
    
    // Внедрение через конструктор (рекомендуемый способ)
    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }
    
    // Альтернатива: внедрение в поле (не рекомендуется для тестирования)
    @Autowired
    private InventoryService inventoryService;
}

10. @Value

Что делает: Внедряет значения из файлов конфигурации (application.properties, application.yml) или системных переменных.

Параметры: value — ключ свойства, required — обязательность.

Пример:

@Service
public class EmailService {
    @Value("${email.host:localhost}")
    private String host;
    
    @Value("${email.port:587}")
    private int port;
    
    @Value("${email.from:noreply@example.com}")
    private String fromAddress;
    
    public void sendEmail(String to, String subject, String body) {
        // Используем host, port, fromAddress
    }
}

Реальный практический пример: REST API для управления задачами

Создадим полноценное приложение для управления списком задач (Todo List) с использованием Spring Boot, Spring Data JPA и H2 базы данных.

Шаг 1: Сущность (Entity)

package com.example.todo.model;

import jakarta.persistence.*;
import java.time.LocalDateTime;

@Entity
@Table(name = "tasks")
public class Task {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(nullable = false)
    private String title;
    
    private String description;
    
    @Enumerated(EnumType.STRING)
    private TaskStatus status = TaskStatus.PENDING;
    
    @Column                    

Рекомендаций