Что такое Spring Boot 3
Spring Boot 3 — это эволюция популярного фреймворка для разработки приложений на Java. Он основан на Spring Framework 6 и требует Java 17+. Основная идея Spring Boot — минимизировать конфигурацию и позволить разработчику сосредоточиться на бизнес-логике.
▸Ключевые особенности Spring Boot 3
Создание проекта
▸Использование Spring Initializr
Самый быстрый способ начать — использовать Spring Initializr (start.spring.io). Выберите:
▸Зависимости
Для REST API минимальный набор зависимостей:
1<dependencies>2 <dependency>3 <groupId>org.springframework.boot</groupId>4 <artifactId>spring-boot-starter-web</artifactId>5 </dependency>6 <dependency>7 <groupId>org.springframework.boot</groupId>8 <artifactId>spring-boot-starter-data-jpa</artifactId>9 </dependency>10 <dependency>11 <groupId>org.postgresql</groupId>12 <artifactId>postgresql</artifactId>13 <scope>runtime</scope>14 </dependency>15</dependencies>
Структура проекта
Стандартная структура Spring Boot проекта:
1src/main/java/com/example/api/2├── ApiApplication.java3├── controller/4│ └── UserController.java5├── service/6│ └── UserService.java7├── repository/8│ └── UserRepository.java9├── model/10│ ├── User.java11│ └── dto/12│ └── UserDto.java13└── exception/14 └── GlobalExceptionHandler.java
Создание REST API
▸Контроллер
1@RestController2@RequestMapping("/api/users")3@RequiredArgsConstructor4public class UserController {56 private final UserService userService;78 @GetMapping9 public ResponseEntity<List<UserDto>> getAllUsers() {10 return ResponseEntity.ok(userService.findAll());11 }1213 @GetMapping("/{id}")14 public ResponseEntity<UserDto> getUserById(@PathVariable Long id) {15 return ResponseEntity.ok(userService.findById(id));16 }1718 @PostMapping19 public ResponseEntity<UserDto> createUser(@Valid @RequestBody CreateUserRequest request) {20 return ResponseEntity.status(HttpStatus.CREATED)21 .body(userService.create(request));22 }2324 @PutMapping("/{id}")25 public ResponseEntity<UserDto> updateUser(26 @PathVariable Long id,27 @Valid @RequestBody UpdateUserRequest request) {28 return ResponseEntity.ok(userService.update(id, request));29 }3031 @DeleteMapping("/{id}")32 public ResponseEntity<Void> deleteUser(@PathVariable Long id) {33 userService.delete(id);34 return ResponseEntity.noContent().build();35 }36}
▸Сервис
1@Service2@RequiredArgsConstructor3@Transactional4public class UserService {56 private final UserRepository userRepository;7 private final UserMapper userMapper;89 public List<UserDto> findAll() {10 return userRepository.findAll().stream()11 .map(userMapper::toDto)12 .toList();13 }1415 public UserDto findById(Long id) {16 User user = userRepository.findById(id)17 .orElseThrow(() -> new ResourceNotFoundException("User not found"));18 return userMapper.toDto(user);19 }2021 public UserDto create(CreateUserRequest request) {22 User user = userMapper.toEntity(request);23 user = userRepository.save(user);24 return userMapper.toDto(user);25 }26}
Конфигурация приложения
▸application.yml
1spring:2 datasource:3 url: jdbc:postgresql://localhost:5432/mydb4 username: ${DB_USER}5 password: ${DB_PASSWORD}6 jpa:7 hibernate:8 ddl-auto: validate9 show-sql: true10 properties:11 hibernate:12 format_sql: true1314server:15 port: 80801617management:18 endpoints:19 web:20 exposure:21 include: health,info,metrics
Обработка ошибок
▸Глобальный обработчик исключений
1@RestControllerAdvice2public class GlobalExceptionHandler {34 @ExceptionHandler(ResourceNotFoundException.class)5 public ResponseEntity<ErrorResponse> handleNotFound(ResourceNotFoundException ex) {6 return ResponseEntity.status(HttpStatus.NOT_FOUND)7 .body(new ErrorResponse("NOT_FOUND", ex.getMessage()));8 }910 @ExceptionHandler(MethodArgumentNotValidException.class)11 public ResponseEntity<ErrorResponse> handleValidation(MethodArgumentNotValidException ex) {12 String message = ex.getBindingResult().getFieldErrors().stream()13 .map(e -> e.getField() + ": " + e.getDefaultMessage())14 .collect(Collectors.joining(", "));15 return ResponseEntity.badRequest()16 .body(new ErrorResponse("VALIDATION_ERROR", message));17 }18}
Тестирование
▸Интеграционные тесты
1@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)2class UserControllerIntegrationTest {34 @Autowired5 private TestRestTemplate restTemplate;67 @Test8 void shouldCreateUser() {9 CreateUserRequest request = new CreateUserRequest("John", "john@example.com");1011 ResponseEntity<UserDto> response = restTemplate.postForEntity(12 "/api/users", request, UserDto.class);1314 assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED);15 assertThat(response.getBody().getName()).isEqualTo("John");16 }17}
Деплой и мониторинг
▸Docker
1FROM eclipse-temurin:17-jre-alpine2WORKDIR /app3COPY target/api-0.0.1-SNAPSHOT.jar app.jar4EXPOSE 80805ENTRYPOINT ["java", "-jar", "app.jar"]
Заключение
Spring Boot 3 значительно упрощает создание REST API в Java. Автоконфигурация, встроенные инструменты и активное сообщество делают его отличным выбором для современной backend-разработки. Для подготовки к собеседованию важно понимать основные концепции: dependency injection, AOP, и паттерны проектирования, используемые в Spring.