Лабораторная работа № 10 — «Spring Boot, IoC/DI и REST-приложение»
Jakarta EE
= набор стандартизованных enterprise-спецификаций/API
+ совместимые runtime/server implementations
Spring Framework / Spring Boot
= независимая framework-экосистема
с IoC container и собственным programming model
Оба подхода современны; в практической работе из-за лимита часов кодируется Spring Boot, а Jakarta EE сравнивается концептуально.
Можно закрепить Spring Boot 4.1.1. Это текущая стабильная ветка; она совместима с Java 17–26, поэтому выбранный JDK 25 подходит без дополнительных переключений.
Часть «контейнер и DI».
Сначала студент генерирует в ИИ обычную Java-версию:
public class FinanceApplication { public static void main(String[] args) { TransactionRepository repository = new InMemoryTransactionRepository(); TransactionService service = new TransactionService(repository); ConsoleController controller = new ConsoleController(service); } }
и отвечает: кто здесь создаёт объекты и кто связывает зависимости?
Затем тот же проект переводится на Spring:
@Repository public class InMemoryTransactionRepository implements TransactionRepository { ... }
@Service
public class TransactionService {
private final TransactionRepository repository;
public TransactionService(
TransactionRepository repository
) {
this.repository = repository;
}
}
@RestController @RequestMapping("/api/transactions") public class TransactionController { private final TransactionService service; public TransactionController( TransactionService service ) { this.service = service; } }
Spring определяет @Component как общий stereotype, а @Repository, @Service и @Controller — как специализированные stereotypes для соответствующих ролей. @RestController композиционно объединяет семантику controller и response body.
РПД прямо требует знания @Autowired; его нужно показать, но не заставлять студентов делать field injection:
@Autowired private TransactionService service;
лучше привести как изучаемый, но не рекомендуемый в данной лабораторной стиль. Spring допускает constructor injection, а при единственном конструкторе @Autowired на нём вообще не обязателен. Это делает зависимости явными и хорошо продолжает SRP/инкапсуляцию, изученные ранее.
Часть REST.
Обязательные endpoints:
POST /api/transactions GET /api/transactions GET /api/transactions/{id} DELETE /api/transactions/{id} GET /api/reports/summary GET /api/reports/by-category
Студент должен показать запросы через IntelliJ HTTP Client, VS Code, Postman-подобный инструмент или curl.
Например:
httpPOST /api/transactions Content-Type: application/json { "date": "2026-09-13", "type": "EXPENSE", "amount": 1250.50, "category": "EDUCATION", "description": "Java course" }
Ключевой критерий — controller не содержит бизнес-логики:
HTTP ↓ Controller ↓ Service ↓ Repository ↓ storage
Самостоятельная часть — Spring Data JPA + H2.
Создаётся JPA-представление транзакции и репозиторий:
public interface TransactionJpaRepository extends JpaRepository<TransactionEntity, UUID> { ... }
Spring Data строит repository abstraction вокруг пары domain/entity type + ID type; CrudRepository предоставляет базовые CRUD-операции, а store-specific интерфейсы, включая JpaRepository, расширяют эту модель.
Требуется заменить in-memory реализацию на H2, не меняя controller. Это очень хороший практический тест понимания DI и Dependency Inversion: внешний контракт остаётся, меняется адаптер хранения.
Структура:
ru.fa.finance ├── controller ├── dto ├── service ├── domain └── repository ├── TransactionRepository └── jpa
Обязательная демонстрация на защите: преподаватель просит заменить одну реализацию TransactionRepository другой. Студент должен объяснить, почему controller не создаёт repository через new.
Что не нужно перегружать в эту лабораторную: Spring Security, Docker, Kafka, микросервисы, OAuth2, Kubernetes. Они не нужны для достижения целей и только замаскируют базовый IoC/DI.
Вопросы для углубления: Чем концептуально отличаются подходы Java EE
(Jakarta EE) и Spring?Что такое IoC и DI и почему
они важны в корпоративной разработке?Какую
роль играют основные стереотипы/аннотации
Spring (@Component, @Service, @Controller,
@Autowired)?Зачем нужен Spring Boot и что дает
автоконфигурация?Как выглядит типовая слоистая
архитектура приложения
(controller/service/repository)?
