# xSpringBoot **Repository Path**: one-core/x-spring-boot ## Basic Information - **Project Name**: xSpringBoot - **Description**: No description available - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2021-01-24 - **Last Updated**: 2025-03-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Boot 实践 ## Spring Initializr (Spring Initializr)[https://start.spring.io/]提供了一个简单的方法来创建一个新的Spring Boot项目。 可根据需要加载依赖,并确保依赖项经过测试和验证,并适用于Spring自动配置。 ## 工程目录结构 > 采用分模块形式,降低修改代码时模块间的相互影响 1. controller,存放接口相关类,包括内部接口和开放接口 2. service,存放业务实现相关类 3. dao,存放数据交互相关类,例如DB等 4. external,存放和外部系统交互相关类,包括外部rpc、rest等接口 5. common,存放配置相关类、通用功能类、公共常量、枚举等 6. 所有模块以根pom.xml为父节点 ## 保持Controller简洁和专注 1. 围绕用例/业务能力设计 2. 仅做协调和委派,不执行任何实际业务逻辑 3. 预处理HTTP信息,不能传递给服务 4. 无状态,默认单例 参考:https://en.wikipedia.org/wiki/GRASP_(object-oriented_design)#Controller ### 关键点 1. 采用构造器注入,避免字段注入。参考:https://www.cnblogs.com/joemsu/p/7688307.html 2. 统一响应体结构。参考:`com.example.common.base.AppResponse` 3. 统一请求体校验。参考:Bean Validation 4. 采用Swagger在线API。参考:`com.example.common.config.SwaggerConfig` 5. 通过URL区分内部和外部接口。参考:`com.example.controller.v1` 6. 为API增加版本号分组。参考:`com.example.controller.v1` 7. SpringBootApplication入口类放在项目顶级包下。参考:`com.example.MainApplication` ## 围绕业务功能构建Service 1. 围绕业务功能/领域/用例来构建服务 2. 通过Manager访问Dao ### 关键点 1. 服务独立package 2. 采用构造器注入,避免字段注入。 3. 采用@Slf4j注解,实现日志打印。 4. 采用DTO对外数据传输对象 5. 通过MapStruct实现DTO对象Mapper。参考:https://mapstruct.org/ 6. Manager提供独立服务或组合服务的DAO数据 ## 采用数据库ORM并独立于业务逻辑 1. 采用Mybatis-Plus操作数据库 2. 采用AutoGenerator生成表相关代码 ### 关键点 1. 统一通过manager操作dao对应的service 2. 不直接操作mapper ## 封装REST和RPC客户端访问第三方服务 1. REST采用Retrofit框架。参考:https://square.github.io/retrofit/ 2. 特定数据缓存采用Guava Cache框架。参考:https://github.com/google/guava/wiki/CachesExplained ## 测试你的代码 1. 单元测试。参考:`com.example.test.ut` 2. 集成测试。参考:`com.example.test.it` 参考:https://juejin.cn/post/6844903953948213262 ## 其他 ### Lombok 1. 使用Lombok注解减少代码量,参考:https://projectlombok.org/features/all ### 全局错误码和异常规划 1. 错误码采用枚举形式,方便通过名称快速知道错误含义 2. 异常统一继承RuntimeException,避免显示捕获,方便统一异常处理 3. 和项目模块一一对应,方便快速问题定界 > `com.example.common.exception` 1. AppException和AppExceptionEnum,对应公共模块异常 2. ExternalException和ExternalExceptionEnum,对应三方系统异常 3. DaoException和DaoExceptionEnum,对应数据存储异常 4. ServiceException和ServiceExceptionEnum,对应业务逻辑异常 ### 全局国际化处理 1. messages多语言配置 2. 国际化@Configuration > `com.example.common.config.InternationalConfig` 参考:https://developer.ibm.com/zh/languages/spring/articles/j-globalization-practice-in-springboot-framework/ ### 全局异常处理 1. 默认异常处理 2. 分层分类异常处理 > `com.example.common.base.AppExceptionHandler` ### 配置属性加解密 1. 加解密@Configuration,`com.example.common.config.EncryptablePropertyConfig` 2. 自定义加解密工具类,`com.example.common.util.Base64Util` 3. 采用满足业务要求的加解密方法 ### 统一日志处理框架 1. 采用Logback框架,logback-spring.xml 2. 自定义服务包的日志级别 ### 统一请求访问日志 1. 日志@Aspect 2. 记录入口、正常返回和异常返回日志 > `com.example.common.config.LogAspect` ### 统一日志链路跟踪 1. 定义跟踪ID,`com.example.common.config.LogFilter` 2. 配置日志框架,`logback-spring.xml` 3. 线程池处理,`com.example.common.config.ExecutorConfig` ### 系统多环境配置 1. 独立环境配置application.yml 2. 自动package > `application.yml` ### 有限状态机 1. 基于有向图 2. 自定义状态 3. 自定义钩子函数:`com.example.common.fsm.Call` 4. 固定分支:`When` > `com.example.common.fsm` ### 统一工单审批 1. 统一申请审批流程:`com.example.service.workorder` 2. 统一业务工单管理。参考:`com.example.service.workorder.user` ### 统一动作流 1. 定义Action:`com.example.common.flow.action` 2. 定义ActionFlow:`com.example.common.flow` ### 统一上下文获取 > `com.example.common.base.AppSpringContext` ### 统一权限校验 1. 用户信息缓存:`com.example.common.cache.user` 2. 统一切面校验:`com.example.common.config.AuthAspect` ### 项目监控 1. actuator监控 2. security配置。参考:`com.example.common.config.SecurityConfig` ### 项目启动 1. SpringBoot启动 2. Tomcat启动。参考:`com.example.MainApplication`