webprogr.ru Новости

RSS

{{toodo.preview}}

...
{{toodo.name}}

{{toodo.preview}}

далее..

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

смотреть..

toodo.name

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

перейти...

{{toodo.preview}}

...
{{toodo.name}}

{{toodo.preview}}

далее..

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

смотреть..

toodo.name

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

перейти...


Последние новости

Лабораторная работа № X : Современные технологии корпоративной разработки на Java: Java EE и Spring.

(проект лабораторной работы и будет правиться по результатам лаб 9)

Лабораторная работа № 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.

Например:

http

POST /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)?
Рейтинг@Mail.ru