⌂ Index
Kapitel 22 · Architecture

Spring Modulith für modulare Monolithen

Typ: FrameworkVersion 2 ausführlich

Spring Modulith unterstützt domänengetriebene Module innerhalb einer Spring-Boot-Anwendung inklusive Modulprüfung, Integrationstests, Dokumentation und Modul-Events.

Fachliche Einordnung

Viele Teams springen zu früh auf Microservices. Ein modularer Monolith kann klare Grenzen, schnellere lokale Entwicklung und geringere Betriebsbelastung bieten.

Enterprise-Merksatz: Spring Modulith unterstützt domänengetriebene Module innerhalb einer Spring-Boot-Anwendung inklusive Modulprüfung, Integrationstests, Dokumentation und Modul-Events.

Technische Darstellung

Root Package Order Module Inventory Module Billing Module Published API Module Tests
Kernkonzepte
  • Application Modules über Package-Struktur.
  • Published Language und erlaubte Abhängigkeiten.
  • Modul-Verifikation in Tests.
  • Application Events zwischen Modulen.
  • Dokumentationssnippets und Modul-Observability.
Wann einsetzen?
  • Du willst fachliche Module schneiden, aber nicht sofort deploybare Microservices.
  • Du modernisierst einen Monolithen und brauchst klare Grenzen.
  • Du willst Architekturregeln automatisiert testen.
Typische Fehler und Risiken
  • Package-Struktur spiegelt keine fachliche Domäne.
  • Module greifen direkt auf fremde Repositories zu.
  • Events ersetzen klare Use-Case-Schnittstellen an falscher Stelle.
Legacy- und Modernisierungssicht

Ein Big-Ball-of-Mud-Monolith wird zuerst in Modulith-Module geschnitten; erst stabile Module werden später Kandidaten für Services.

Ausführliches Beispiel

Das Beispiel zeigt bewusst nicht nur Annotationen, sondern auch die Verantwortung der Schicht. In echten Projekten sollte der technische Spring-Code an Adapter- oder Konfigurationsrändern bleiben, während die Fachlogik testbar und möglichst frameworkarm bleibt.

@ApplicationModule(
    displayName = "Order Management",
    allowedDependencies = { "inventory :: api", "billing :: api" }
)
package com.example.order;

import org.springframework.modulith.ApplicationModule;

// Modulprüfung
class ArchitectureTests {
    @Test
    void verifiesModularStructure() {
        ApplicationModules.of(OrderApplication.class).verify();
    }
}
Checkliste für Reviews
  • Ist die Verantwortung des Bausteins klar: Framework steuert Lebenszyklus, Library wird gezielt benutzt?
  • Ist die Fachlogik außerhalb von Controller, Listener, Repository-Implementierung oder Konfiguration?
  • Sind Fehlerfälle, Timeouts, Security, Monitoring und Tests sichtbar modelliert?
  • Gibt es klare Grenzen zwischen DTO, Domäne, Persistence und Infrastruktur?