Communitygithub.com

giuseppe-trisciuoglio/clean-architecture

为Java 21+和Spring Boot 3.5+应用提供整洁架构、六边形架构(端口与适配器)以及领域驱动设计的实现模式。适用于分层架构设计、领域逻辑与框架解耦、端口与适配器实现、实体/值对象/聚合创建,或重构单体代码库以提升可测试性和可维护性。

clean-architecture 是什么?

该技能提供了在Java 21+和Spring Boot 3.5+应用中实施整洁架构、六边形架构(端口与适配器)以及领域驱动设计的结构化模式和最佳实践。它帮助开发者清晰划分应用层、领域层和基础设施层,将领域逻辑与框架细节完全解耦,从而提升代码的可测试性和可维护性。技能支持多种流行框架和工具,包括Spring Boot、Lombok、MapStruct、JDK记录类型等,并提供了从基础概念到高级模式(如事件驱动、CQRS)的完整示例。通过使用本技能,开发者可以快速搭建符合整洁架构原则的项目骨架,有效管理实体、值对象、聚合、仓储、应用服务等核心构件,并利用依赖注入和AOP实现横切关注点的分离。该技能特别适合需要重构单体应用、构建微服务,或希望遵循领域驱动设计原则的Java开发团队。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit/tree/main/skills/clean-architecture

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

clean-architecture 是做什么的?

为Java 21+和Spring Boot 3.5+应用提供整洁架构、六边形架构(端口与适配器)以及领域驱动设计的实现模式。适用于分层架构设计、领域逻辑与框架解耦、端口与适配器实现、实体/值对象/聚合创建,或重构单体代码库以提升可测试性和可维护性。

概述

该技能提供了一套经过验证的模式,帮助你在基于Java 21+和Spring Boot 3.5+的项目中构建整洁且可持续的架构。它涵盖了整洁架构、六边形架构(端口与适配器)以及领域驱动设计(DDD)的核心概念,并提供了具体的代码示例和最佳实践。

核心原则

  • 依赖反转:高层模块不应依赖低层模块,两者都应依赖抽象。抽象不应依赖细节,细节应依赖抽象。
  • 领域隔离:将领域逻辑与基础设施、框架和外部关注点完全分离。
  • 测试性:通过解耦和接口抽象,使领域层和应用层能够轻松进行单元测试。
  • 可维护性:通过清晰的架构边界和代码组织,降低变更成本和引入缺陷的风险。

架构层

层级职责典型组件
领域层核心业务逻辑和规则实体、值对象、聚合、领域服务、仓储接口
应用层用例编排、事务管理、权限控制应用服务、命令/查询处理器、DTO
基础设施层与外部系统的集成仓储实现、消息客户端、数据库访问、REST控制器

技术栈

  • 语言:Java 21+(推荐使用记录类型、密封类、模式匹配等特性)
  • 框架:Spring Boot 3.5+
  • 构建工具:Maven 或 Gradle
  • 数据库:JPA/Hibernate、Spring Data JDBC、MyBatis 等
  • 测试:JUnit 5、Mockito、ArchUnit(用于架构约束)

快速开始

1. 初始化项目结构

src/
  main/
    java/
      com/example/
        domain/
          model/
            entity/
            valueobject/
            aggregate/
          service/
          repository/
        application/
          service/
          port/
            inbound/
            outbound/
          dto/
        infrastructure/
          adapter/
            inbound/
              rest/
              message/
            outbound/
              persistence/
              messaging/
          config/

2. 定义领域实体

public record OrderId(UUID id) {}

public class Order {
    private OrderId id;
    private CustomerId customerId;
    private List<OrderLineItem> items;
    private OrderStatus status;
    
    // 业务行为封装在领域实体中
    public void addItem(Product product, int quantity) {
        // 业务规则验证
    }
    
    public void confirm() {
        // 状态转换逻辑
    }
}

3. 实现端口与适配器

输出端口(由领域层定义,基础设施层实现)

// domain/repository/OrderRepository.java
public interface OrderRepository {
    Optional<Order> findById(OrderId id);
    void save(Order order);
    void delete(OrderId id);
}

// infrastructure/adapter/outbound/persistence/JpaOrderRepository.java
@Component
public class JpaOrderRepository implements OrderRepository {
    private final SpringDataJpaOrderRepository springRepo;
    private final OrderMapper mapper;
    
    @Override
    public Optional<Order> findById(OrderId id) {
        return springRepo.findById(id.id())
            .map(mapper::toDomain);
    }
    
    @Override
    public void save(Order order) {
        var entity = mapper.toEntity(order);
        springRepo.save(entity);
    }
}

4. 编写应用服务

// application/service/OrderApplicationService.java
@Service
@Transactional
public class OrderApplicationService {
    private final OrderRepository orderRepository;
    private final DomainEventPublisher eventPublisher;
    
    public OrderId createOrder(CreateOrderCommand command) {
        var order = new Order(OrderId.generate(), command.customerId());
        command.items().forEach(item -> order.addItem(item.product(), item.quantity()));
        orderRepository.save(order);
        eventPublisher.publish(new OrderCreatedEvent(order.id()));
        return order.id();
    }
}

高级模式

事件驱动架构

// 领域事件定义
public record OrderConfirmedEvent(OrderId orderId, Instant occurredOn) implements DomainEvent {}

// 事件处理器
@Component
public class OrderConfirmedHandler {
    @EventListener
    public void handle(OrderConfirmedEvent event) {
        // 处理事件,如发送通知、更新库存等
    }
}

CQRS 模式

// 命令
public record CreateOrderCommand(CustomerId customerId, List<OrderItemDto> items) {}

// 查询(返回视图模型)
public record OrderSummaryView(OrderId id, CustomerId customerId, BigDecimal total, OrderStatus status) {}

// 查询处理器
@Component
public class OrderQueryHandler {
    private final OrderReadRepository readRepository;
    
    public OrderSummaryView getOrderSummary(OrderId id) {
        return readRepository.findSummaryById(id);
    }
}

架构测试

使用ArchUnit强制执行架构约束:

@ArchTest
static final ArchRule domain_should_not_depend_on_infrastructure = 
    classes()
        .that().resideInAPackage("..domain..")
        .should().onlyDependOnClassesThat()
            .resideInAnyPackage("java..", "..domain..");

@ArchTest
static final ArchRule application_should_only_depend_on_domain =
    classes()
        .that().resideInAPackage("..application..")
        .should().onlyDependOnClassesThat()
            .resideInAnyPackage("java..", "..domain..", "..application..");

最佳实践

  1. 保持领域层纯净:领域层不应导入任何Spring或框架注解。
  2. 使用接口定义边界:输出端口由领域层定义,输入端口由应用层定义。
  3. 避免贫血模型:将业务逻辑尽可能封装在领域实体和值对象中。
  4. 小聚合:每个聚合应尽量小,以维持一致性和性能。
  5. 显式依赖:应用服务通过构造器注入明确声明所需依赖。
  6. 使用ArchUnit:自动化验证架构规则,防止退化。

常见陷阱

  • 领域层泄漏到基础设施层
  • 过于复杂的聚合导致性能问题
  • 忽略值对象的不可变性
  • 依赖注入泛滥导致设计退化

参考资料

  • Robert C. Martin,《整洁架构》
  • Eric Evans,《领域驱动设计》
  • Alistair Cockburn,《六边形架构》
  • Spring官方文档

许可证

MIT

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

giuseppe-trisciuoglio/aws-lambda-java-integration

Provides AWS Lambda integration patterns for Java with cold start optimization. Use when deploying Java functions to AWS Lambda, choosing between Micronaut and Raw Java approaches, optimizing cold starts below 1 second, configuring API Gateway or ALB integration, or implementing serverless Java applications. Triggers include "create lambda java", "deploy java lambda", "micronaut lambda aws", "java lambda cold start", "aws lambda java performance", "java serverless framework".

giuseppe-trisciuoglio/aws-lambda-php-integration

Provides AWS Lambda integration patterns for PHP with Symfony using the Bref framework. Creates Lambda handler classes, configures runtime layers, sets up SQS/SNS event triggers, implements warm-up strategies, and optimizes cold starts. Use when deploying PHP/Symfony applications to AWS Lambda, configuring API Gateway integration, implementing serverless PHP applications, or optimizing Lambda performance with Bref. Triggers include "create lambda php", "deploy symfony lambda", "bref lambda aws", "php lambda cold start", "aws lambda php performance", "symfony serverless", "php serverless framework".

giuseppe-trisciuoglio/aws-lambda-python-integration

Provides AWS Lambda integration patterns for Python with cold start optimization. Use when deploying Python functions to AWS Lambda, choosing between AWS Chalice and raw Python approaches, optimizing cold starts, configuring API Gateway or ALB integration, or implementing serverless Python applications. Triggers include "create lambda python", "deploy python lambda", "chalice lambda aws", "python lambda cold start", "aws lambda python performance", "python serverless framework".

giuseppe-trisciuoglio/aws-lambda-typescript-integration

Provides AWS Lambda integration patterns for TypeScript with cold start optimization. Use when creating or deploying TypeScript Lambda functions, choosing between NestJS framework and raw TypeScript approaches, optimizing cold starts, configuring API Gateway or ALB integration, or implementing serverless TypeScript applications. Triggers include "create lambda typescript", "deploy typescript lambda", "nestjs lambda aws", "raw typescript lambda", "aws lambda typescript performance".

giuseppe-trisciuoglio/aws-rds-spring-boot-integration

Provides patterns to configure AWS RDS (Aurora, MySQL, PostgreSQL) with Spring Boot applications. Configures HikariCP connection pools, implements read/write splitting, sets up IAM database authentication, enables SSL connections, and integrates with AWS Secrets Manager. Use when setting up RDS connections in Spring Boot, configuring connection pooling, or managing database credentials securely.

giuseppe-trisciuoglio/aws-sdk-java-v2-bedrock

Provides Amazon Bedrock patterns using AWS SDK for Java 2.x. Invokes foundation models (Claude, Llama, Titan), generates text and images, creates embeddings for RAG, streams real-time responses, and configures Spring Boot integration. Use when asking about Bedrock integration, Java SDK for AI models, AWS generative AI, Claude/Llama invocation, embeddings for RAG, or Spring Boot AI setup.

giuseppe-trisciuoglio/aws-sdk-java-v2-core

Provides AWS SDK for Java 2.x client configuration, credential resolution, HTTP client tuning, timeout, retry, and testing patterns. Use when creating or hardening AWS service clients, wiring Spring Boot beans, debugging auth or region issues, or choosing sync vs async SDK usage.

giuseppe-trisciuoglio/aws-sdk-java-v2-dynamodb

Provides Amazon DynamoDB patterns using AWS SDK for Java 2.x. Use when creating, querying, scanning, or performing CRUD operations on DynamoDB tables, working with indexes, batch operations, transactions, or integrating with Spring Boot applications.

giuseppe-trisciuoglio/aws-sdk-java-v2-kms

Provides AWS Key Management Service (KMS) patterns using AWS SDK for Java 2.x. Use when creating/managing encryption keys, encrypting/decrypting data, generating data keys, digital signing, key rotation, or integrating encryption into Spring Boot applications.

giuseppe-trisciuoglio/aws-sdk-java-v2-lambda

Provides AWS Lambda patterns using AWS SDK for Java 2.x. Use when invoking Lambda functions, creating/updating functions, managing function configurations, working with Lambda layers, or integrating Lambda with Spring Boot applications.

giuseppe-trisciuoglio/aws-sdk-java-v2-messaging

Provides AWS messaging patterns using AWS SDK for Java 2.x for SQS queues and SNS topics. Handles sending/receiving messages, FIFO queues, DLQ, subscriptions, and pub/sub patterns. Use when implementing messaging with SQS or SNS.

giuseppe-trisciuoglio/aws-sdk-java-v2-rds

Provides AWS RDS (Relational Database Service) management patterns using AWS SDK for Java 2.x. Use when creating, modifying, monitoring, or managing Amazon RDS database instances, snapshots, parameter groups, and configurations.

giuseppe-trisciuoglio/aws-sdk-java-v2-s3

Provides Amazon S3 patterns and examples using AWS SDK for Java 2.x. Use when working with S3 buckets, uploading/downloading objects, multipart uploads, presigned URLs, S3 Transfer Manager, object operations, or S3-specific configurations.

giuseppe-trisciuoglio/aws-sdk-java-v2-secrets-manager

Provides AWS Secrets Manager patterns for AWS SDK for Java 2.x, including secret retrieval, caching, rotation-aware access, and Spring Boot integration. Use when storing or reading secrets in Java services, replacing hardcoded credentials, or wiring secret-backed configuration into applications.

giuseppe-trisciuoglio/better-auth

Provides Better Auth integration patterns for NestJS backend and Next.js frontend with Drizzle ORM and PostgreSQL. Use when setting up Better Auth with NestJS backend, integrating Next.js App Router frontend, configuring Drizzle ORM schema, implementing social login (GitHub, Google), adding plugins (2FA, Organization, SSO, Magic Link, Passkey), implementing email/password authentication with session management, or creating protected routes and middleware.

giuseppe-trisciuoglio/chunking-strategy

Provides chunking strategies for RAG systems. Generates chunk size recommendations (256-1024 tokens), overlap percentages (10-20%), and semantic boundary detection methods. Validates semantic coherence and evaluates retrieval precision/recall metrics. Use when building retrieval-augmented generation systems, vector databases, or processing large documents.

giuseppe-trisciuoglio/docs-updater

Provides automated documentation updates by analyzing git changes between the current branch and the last release tag. Performs git diff analysis to identify modifications, then updates README.md, CHANGELOG.md following Keep a Changelog standard, and discovers documentation folders for contextual updates. Use when preparing a release, maintaining documentation sync, or before creating a pull request. Triggers on "update docs", "update changelog", "sync documentation", "update readme", "prepare release documentation".

giuseppe-trisciuoglio/drawio-logical-diagrams

Creates professional logical flow diagrams and logical system architecture diagrams using draw.io XML format (.drawio files). Use when creating: (1) logical flow diagrams showing data/process flow between system components, (2) logical architecture diagrams representing system structure without cloud provider specifics, (3) BPMN process diagrams, (4) UML diagrams (class, sequence, activity), (5) data flow diagrams (DFD), (6) decision flowcharts, or (7) system interaction diagrams. This skill focuses on generic/abstract representations, not AWS/Azure-specific architectures (use aws-drawio-architecture-diagrams for cloud diagrams).

giuseppe-trisciuoglio/drizzle-orm-patterns

Provides comprehensive Drizzle ORM patterns for schema definition, CRUD operations, relations, queries, transactions, and migrations. Proactively use for any Drizzle ORM development including defining database schemas, writing type-safe queries, implementing relations, managing transactions, and setting up migrations with Drizzle Kit. Supports PostgreSQL, MySQL, SQLite, MSSQL, and CockroachDB.

giuseppe-trisciuoglio/github-issue-workflow

Provides a structured 8-phase workflow for resolving GitHub issues in Claude Code. Covers fetching issue details, analyzing requirements, implementing solutions, verifying correctness, performing code review, committing changes, and creating pull requests. Use when user asks to resolve, implement, work on, fix, or close a GitHub issue, or references an issue URL or number for implementation.

相关技能