Spring Boot Umsetzung im Praxisprojekt

Spring Boot wird als Laufzeit- und Adapterrahmen verwendet, nicht als Ersatz für fachliche Architektur.

Spring BootRESTConfigurationActuator
Spring Boot Request-Lifecycle im Praxisprojekt
Spring Boot Request-Lifecycle im Praxisprojekt

Rolle von Spring

Spring Boot eignet sich für schnelle produktionsnahe Services mit Autoconfiguration, Actuator, Security-Integration und starkem Ökosystem. Im Architekturmodell sitzt Spring am Rand: Controller, Configuration, Security Filter, Repository-Implementierung und Observability.

Controller

Spring Controller als dünner Inbound Adapter
@RestController
@RequestMapping("/api/orders")
final class OrderController { // Pattern: Inbound Adapter
    private final PlaceOrderUseCase placeOrder;

    OrderController(PlaceOrderUseCase placeOrder) {
        this.placeOrder = placeOrder;
    }

    @PostMapping
    ResponseEntity<OrderResponse> place(@Valid @RequestBody PlaceOrderRequest request) {
        OrderId id = placeOrder.handle(request.toCommand());
        return ResponseEntity.created(URI.create("/api/orders/" + id.value()))
                .body(new OrderResponse(id.value(), "ACCEPTED"));
    }
}

Konfiguration

Spring-Konfiguration verdrahtet Ports und Adapter. Der Use Case bleibt frei von Spring-Annotationen.

Composition Root in Spring
@Configuration
class OrderApplicationConfig {
    @Bean
    PlaceOrderUseCase placeOrderUseCase(OrderRepository orders,
                                        InventoryPort inventory,
                                        TransactionRunner tx,
                                        OutboxPort outbox) {
        return new PlaceOrderUseCase(orders, inventory, tx, outbox);
    }
}

Transaktionen

Transaktionsgrenzen gehören in die Application-Schicht oder einen expliziten TransactionRunner. Dadurch bleibt klar, welcher Use Case atomar sein muss.

Betrieb

EndpointZweck
/actuator/health/readinessTraffic-Fähigkeit prüfen
/actuator/metricsMetriken für Betrieb und SLOs
/actuator/prometheusPrometheus Scraping
/actuator/loggersTemporäre Diagnose

Fehlerbild

SchlechtBesser
@Transactional überallTransaktionsgrenzen pro Use Case bewusst setzen
Entity direkt als API ResponseDTO/Response-Vertrag stabil halten
Business-Logik im ControllerController als Adapter halten
⌂ Cockpit