Перейти к основному содержимому

Первая программа на Spring Framework

Разработчику Архитектору

Первая программа на Spring Framework

Spring Framework представляет собой мощную платформу для создания корпоративных приложений на языке Java. Платформа реализует концепцию внедрения зависимостей (Dependency Injection) и аспект-ориентированного программирования, что позволяет создавать слабосвязанные модули с высокой степенью переиспользуемости кода. Создание первой программы демонстрирует базовую архитектуру приложения: конфигурацию контейнера, создание управляемых объектов (beans), определение сервисной логики и настройку веб-сервера. В данном материале рассматривается создание простого REST API сервиса, который принимает имя пользователя и возвращает приветствие.


Создание проекта

Для начала работы требуется среда выполнения Java версии 17 или выше. Необходим также инструмент сборки проектов Maven, который управляет зависимостями и процессом компиляции.

Процесс инициализации нового проекта выполняется через официальный генератор проектов Spring Initializr или вручную с использованием шаблонов Maven. Система автоматически создаст структуру папок, настроит зависимости Spring Boot и файл конфигурации.

# Использование Spring Initializr через командную строку (пример)
curl https://start.spring.io/starter.zip \
-d type=maven-project \
-d language=java \
-d bootVersion=3.2.0 \
-d baseDir=my-first-spring-app \
-d groupId=com.example \
-d artifactId=demo \
-d name=demo \
-d packageName=com.example.demo \
-d dependencies=web,lombok \
-o demo.zip

unzip demo.zip
cd demo

Команда скачивает архив с готовым проектом, распаковывает его и переводит в директорию проекта. Файл pom.xml содержит описание зависимостей. Ключевые зависимости включают spring-boot-starter-web для создания веб-приложений и lombok для сокращения объема кода за счет аннотаций.

Запуск сервера осуществляется командой mvn spring-boot:run или через интерфейс IDE. Приложение становится доступным по адресу http://localhost:8080.


Структура приложения

Проект Spring Boot следует стандартной структуре каталогов. Корневая директория содержит файл конфигурации application.properties или application.yml. Внутри пакета основного приложения находится класс, помеченный аннотацией @SpringBootApplication, который запускает контейнер.

Создадим пакет com.example.demo.controller для размещения контроллеров и com.example.demo.service для бизнес-логики.

Файл src/main/java/com/example/demo/DemoApplication.java:

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);
}
}

Аннотация @SpringBootApplication объединяет три функции: включает автоматическую конфигурацию Spring, включает сканирование компонентов и определяет точку входа в приложение. Метод main запускает контекст приложения, который создает все необходимые объекты.


Определение модели данных

Модель данных представляет собой объект, который хранит информацию, передаваемую между клиентом и сервером. В Spring используют обычные классы Java для представления этих данных.

Создадим класс Greeting, который будет содержать поле имени и текст сообщения.

Файл src/main/java/com/example/demo/model/Greeting.java:

package com.example.demo.model;

import lombok.Data;

@Data
public class Greeting {
private String message;
private String name;

public Greeting() {
this.message = "Привет";
this.name = "Мир";
}

public Greeting(String name) {
this.message = "Привет";
this.name = name;
}

public String getMessage() {
return message + ", " + name + "!";
}
}

Класс использует аннотацию @Data из библиотеки Lombok, которая автоматически генерирует геттеры, сеттеры, метод toString() и конструкторы. Это избавляет от необходимости писать шаблонный код. Поля message и name являются приватными, но доступны через сгенерированные методы. Конструктор без параметров необходим для десериализации JSON-объектов при получении запросов от клиента.


Сервисный слой

Сервисный слой инкапсулирует бизнес-логику приложения. Он не зависит от веб-слоя и может использоваться в консоли, планировщике задач или других сервисах.

Создадим класс GreetingService, который формирует ответное сообщение.

Файл src/main/java/com/example/demo/service/GreetingService.java:

package com.example.demo.service;

import com.example.demo.model.Greeting;
import org.springframework.stereotype.Service;

@Service
public class GreetingService {

public Greeting createGreeting(String name) {
if (name == null || name.trim().isEmpty()) {
return new Greeting("Гость");
}
return new Greeting(name.trim());
}
}

Аннотация @Service помечает класс как компонент Spring, подлежащий автоматическому созданию и внедрению в другие части приложения. Метод createGreeting проверяет входные данные и возвращает экземпляр модели Greeting. Логика обработки ошибок и форматирования текста сосредоточена здесь, а не в контроллере.


Контроллер и REST API

Контроллер обрабатывает входящие HTTP-запросы и возвращает ответы. В Spring MVC используются аннотации для определения маршрутов и типов данных.

Создадим класс GreetingController, который будет принимать имя в URL и вызывать сервис.

Файл src/main/java/com/example/demo/controller/GreetingController.java:

package com.example.demo.controller;

import com.example.demo.model.Greeting;
import com.example.demo.service.GreetingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

private final GreetingService greetingService;

@Autowired
public GreetingController(GreetingService greetingService) {
this.greetingService = greetingService;
}

@GetMapping("/greet/{name}")
public Greeting greet(@PathVariable String name) {
return greetingService.createGreeting(name);
}
}

Аннотация @RestController указывает, что класс является контроллером, а результаты методов будут сериализованы в формат JSON. Конструктор с аннотацией @Autowired обеспечивает внедрение экземпляра GreetingService в контроллер. Аннотация @GetMapping определяет маршрут /greet/{name}, где {name} является переменным параметром. Аннотация @PathVariable извлекает значение этого параметра из URL и передает его в метод.

При запросе http://localhost:8080/greet/Алексей сервер вернет JSON:

{
"message": "Привет",
"name": "Алексей"
}

Конфигурация приложения

Настройки приложения хранятся в файле src/main/resources/application.properties. Здесь можно изменить порт сервера, включить логирование или настроить параметры базы данных.

Файл src/main/resources/application.properties:

server.port=8080
logging.level.root=INFO
spring.application.name=first-spring-app

Параметр server.port устанавливает порт, на котором работает приложение. Уровень логирования INFO выводит основные события работы сервера. Имя приложения используется для идентификации в логах и системах мониторинга.

Для сложных настроек можно использовать YAML формат файла application.yml:

server:
port: 8080
logging:
level:
root: INFO
spring:
application:
name: first-spring-app

YAML формат позволяет группировать настройки иерархически, что улучшает читаемость конфигурации.


Жизненный цикл компонента

Spring управляет жизненным циклом всех beans. При запуске приложения контейнер сканирует пакеты, находит классы с аннотациями @Component, @Service, @Repository, @Controller и создает их экземпляры.

Процесс происходит в несколько этапов. Сначала создается пустой объект, затем применяются зависимости через внедрение, после чего вызываются методы инициализации, если они объявлены. При завершении работы приложения вызываются методы уничтожения.

Внедрение зависимостей гарантирует, что каждый компонент получает нужные ему ресурсы без жесткой связи с другими частями системы. Это упрощает тестирование, так как сервисы можно подменять моковыми объектами.


Расширение функционала

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

Добавление метода POST позволяет отправлять данные в теле запроса вместо URL. Для этого используется аннотация @PostMapping и тип данных @RequestBody.

@PostMapping("/greet")
public Greeting postGreet(@RequestBody Greeting request) {
return greetingService.createGreeting(request.getName());
}

Обработка исключений реализуется через глобальный обработчик с аннотацией @ControllerAdvice. Это позволяет централизованно управлять ошибками и возвращать корректные статусы HTTP.

Интеграция с базой данных требует добавления зависимости spring-boot-starter-data-jpa и создания репозитория для хранения данных. Репозиторий наследуется от интерфейса JpaRepository и предоставляет готовые методы для CRUD операций.


Пошаговый запуск

Для успешного запуска приложения необходимо выполнить последовательность действий.

  1. Установите JDK версии 17 или выше с официального сайта oracle.com или adoptium.net.
  2. Откройте терминал или командную строку.
  3. Скачайте проект через Spring Initializr или создайте структуру вручную.
  4. Добавьте зависимости spring-boot-starter-web и lombok в файл pom.xml.
  5. Создайте класс DemoApplication с аннотацией @SpringBootApplication.
  6. Создайте модель Greeting с полями и конструкторами.
  7. Создайте сервис GreetingService с методом формирования ответа.
  8. Создайте контроллер GreetingController с маршрутом GET.
  9. Запустите приложение командой mvn spring-boot:run.
  10. Откройте браузер и перейдите по адресу http://localhost:8080/greet/Имя.

Сервер запустится и начнет слушать запросы. Любые изменения в коде требуют перезапуска приложения для применения изменений.


Рекомендации по развитию

Spring предоставляет мощный инструментарий для построения сложных корпоративных систем. Автоматическая конфигурация и внедрение зависимостей гарантируют гибкость архитектуры. Компонентная структура позволяет строить большие системы из небольших, понятных частей.

Использование аннотаций для декларирования поведения компонентов является стандартом современной разработки Java. Этот подход обеспечивает чистоту кода и упрощает поддержку проектов.

Экспериментируйте с кодом, меняйте маршруты, добавляйте новые сервисы и логику. Практика является лучшим способом усвоения материала.