Spring Boot Umsetzung im Praxisprojekt
Spring Boot wird als Laufzeit- und Adapterrahmen verwendet, nicht als Ersatz für fachliche Architektur.
Spring BootRESTConfigurationActuator
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
| Endpoint | Zweck |
|---|---|
| /actuator/health/readiness | Traffic-Fähigkeit prüfen |
| /actuator/metrics | Metriken für Betrieb und SLOs |
| /actuator/prometheus | Prometheus Scraping |
| /actuator/loggers | Temporäre Diagnose |
Fehlerbild
| Schlecht | Besser |
|---|---|
| @Transactional überall | Transaktionsgrenzen pro Use Case bewusst setzen |
| Entity direkt als API Response | DTO/Response-Vertrag stabil halten |
| Business-Logik im Controller | Controller als Adapter halten |