- Organize by bounded contexts. Each context is a separate package or module with its own domain model.
- Use rich domain entities with behavior — not anemic JavaBeans with getters/setters and external service logic.
- Use Aggregates with a single root entity — persist aggregates as a unit and enforce invariants in the root's methods, not in services.
- Use value objects (records) for concepts defined by attributes: `Money`, `Email`, `DateRange`.
- Define aggregate roots that enforce invariants. Access child entities only through the aggregate.
- Use domain events (`ApplicationEventPublisher` in Spring) for cross-context communication.
- Use factory methods and builders for complex entity creation with validation.