1 规范目的与适用范围

为统一公司Java及SpringBoot技术栈项目的代码命名规则,严格对标《阿里巴巴Java开发手册》强制、推荐条款,规范代码编写标准,提升代码可读性、可维护性与可扩展性,降低团队协作沟通成本,保障项目代码质量,规避线上隐患与研发风险,特制定本规范。

本规范适用于公司所有新建、迭代及维护的Java后端项目、SpringBoot单体及微服务项目,覆盖项目编码、代码评审、测试上线、版本维护全生命周期。全体研发人员必须严格遵照执行,若有特殊业务场景需差异化调整,须经技术负责人审批确认,并形成文档备案。

2 通用基础约定(对标阿里规约)

  1. 语义化要求:命名优先采用完整标准英文单词,杜绝中文拼音、无意义单字母、随意缩写。仅允许使用行业公认、通用标准的简写,如idurldocinfodaoxml,禁止自创非通用缩写。

  2. 大小写与风格约束:Java语言大小写敏感,项目内命名风格必须全局统一,严禁驼峰命名、下划线命名、短横线命名混用。

  3. 标识符语法规则:标识符仅允许以字母、下划线、$开头,后续可跟字母、数字;严禁使用Java关键字、保留字作为标识符。业务代码禁止使用$符号,该符号为Java编译器、内部类专用,避免引发编译冲突与命名混淆。

  4. 长度约束:命名不宜过长,保证语义清晰的前提下控制长度,避免冗余描述;同时禁止过短命名,除循环临时变量i、j、k外,不得使用单个字母命名。

3 Java基础元素命名规范

3.1 包名

  1. 包名统一采用全小写字母,遵循反向域名命名规则,多级包名使用英文点号分隔,禁止使用下划线、大写字母、特殊字符

  2. 标准包名结构:反向域名 + 公司/部门标识 + 项目名称 + 业务模块 + 子功能层级。

  3. 包名层级控制在合理范围,避免过度拆分,通用工具、全局异常、配置类、公共常量等独立划分公共包,与业务代码物理隔离。

package com.company.project.user.service;
package com.company.project.common.exception;
package com.company.project.common.config;
package com.company.project.common.util;

3.2 类、接口、枚举及抽象类

统一采用大驼峰命名法(UpperCamelCase),以名词或名词短语命名,清晰体现类的职责、功能与归属,符合阿里规约强制要求。

  1. 普通业务实体类:直接使用业务语义命名,如UserOrderGoods

  2. 业务接口:不强制添加I前缀,直接通过名称表达功能,如UserServicePayStrategy,团队内部保持一致即可。

  3. 抽象类:统一添加Abstract前缀,便于快速识别,如AbstractUserServiceAbstractBaseController

  4. 枚举类:统一添加Enum后缀,如OrderStatusEnumGenderEnum,枚举常量采用全大写+下划线分隔。

  5. 自定义异常类:必须以Exception作为结尾,如UserNotFoundExceptionParamValidateException,区分运行时异常与检查异常,命名体现异常场景。

  6. 工具类:统一以UtilUtils为后缀,项目全局统一,如StringUtilDateUtils

3.3 方法

采用小驼峰命名法(lowerCamelCase),以动词或动宾短语命名,直观体现方法功能,遵循阿里规约语义化要求。

3.3.1数据查询类动词(核心:区分查询结果形态)

前缀

使用场景

典型示例

避坑说明

get

1. 根据唯一标识(ID / 主键)查询单条数据;

2. 获取对象的单个属性值

getUserById(Long id)

getOrderNo()

禁止用于集合查询,如getUsers()

find

1. 根据非主键条件查询单条数据;

2. 语义更灵活的精准查询

findUserByPhone(String phone)

findOrderByTradeNo(String tradeNo)

结果必须是单个对象,非 List

list

查询多条 / 集合数据(不分页),强调 “列表形态”

listOrderByStatus(Integer status)

listAllRegions()

结果必为 Collection/List 类型

query

1. 复杂条件查询(多参数 / 组合条件);

2. 分页查询(核心标识)

queryUserByCondition(UserQueryDTO dto)

queryOrderPage(PageParam param)

分页查询优先用queryXXXPage

补充规则

  • 分页查询建议在query后加Page后缀,如queryUserPage(PageParam param),一眼识别分页;

  • 统计类查询统一用 count 作为前缀(优先级最高),特殊场景可补充 sum/avg/max/min 等前缀,返回值类型严格对应统计结果的数值类型,如countUserByDeptId(Long deptId),不混用get/count

  • 模糊查询可加search前缀,如searchUserByName(String keyword),区分精准 / 模糊查询。

3.3.2数据新增 / 修改类动词(核心:区分操作类型和覆盖范围)

前缀

使用场景

典型示例

避坑说明

save

1. 新增 + 更新通用(“保存”,支持幂等);

2. 无明确新增 / 更新区分时使用

saveUser(UserDTO dto)(根据 ID 是否为空判断增 / 改)

团队需统一save的语义规则

insert

纯新增操作(强制语义,仅插入新数据)

insertUser(UserDTO dto)

禁止用于更新操作

add

轻量新增(偏业务场景,如 “添加” 关联关系)

addRoleToUser(Long userId, Long roleId)

不用于核心实体的新增

update

纯更新操作(覆盖全量 / 部分字段)

updateUserInfo(Long id, UserDTO dto)

部分更新可加partial,如updateUserPartial

补充规则

  • 批量新增用batchInsert,如batchInsertUser(List<UserDTO> list)

  • 批量更新用batchUpdate,禁止用batchSave(语义模糊);

  • 新增后返回主键的场景,可保持insert前缀,如insertUserReturnId(UserDTO dto)

3.3.3数据删除类动词(核心:区分物理删除 / 逻辑删除)

前缀

使用场景

典型示例

避坑说明

delete

物理删除(从数据库中直接移除数据)

deleteUserById(Long id)

仅用于真删除,逻辑删除禁用

remove

1. 逻辑删除(标记删除状态,如deleted=1);

2. 移除关联关系 / 缓存等

removeUserFromBlacklist(Long userId)

removeCache(String key)

逻辑删除优先用remove,避免误解

补充规则

  • 批量删除用batchDelete/batchRemove,语义与单条保持一致;

  • 恢复删除数据用restore前缀,如restoreUser(Long id),不混用update/restore

3.3.4布尔判断类动词(核心:区分判断的语义类型)

前缀

使用场景

典型示例

避坑说明

is

判断 “状态 / 属性是否为某值”(针对布尔属性 / 枚举状态)

isUserActive(Long id)

isOrderPaid(Long orderId)

结果必为 boolean,禁止返回其他类型

has

判断 “是否拥有 / 存在某资源 / 关联关系”

hasPermission(Long userId, String perm)

hasUnreadMessage(Long userId)

强调 “拥有权 / 存在性”

can

判断 “是否具备某操作权限 / 能力”

canEditOrder(Long userId, Long orderId)

canWithdraw(Long accountId)

强调 “操作可行性”

should

判断 “是否应该执行某操作”(偏业务规则判断)

shouldSendReminder(Long orderId)

shouldLockAccount(Long userId)

偏业务决策,非基础状态判断

补充规则

  • 所有判断方法名后建议补充判断维度,如isUserActive而非isActive,避免语义模糊;

  • 如用check作为判断前缀(check更适合 “校验并抛异常”,如checkUserPermission)。

总结

  1. 核心原则:动词前缀的选择以 “语义唯一、团队统一” 为核心,比如一旦约定save为 “新增 + 更新”,全项目必须严格遵守;

  2. 优先级get/find(单条)> list/query(多条 / 分页)、insert/update(明确增改)> save(通用增改)、delete(物理删)> remove(逻辑删);

  3. 易混点is(状态判断)≠ has(存在判断)≠ can(能力判断),get(主键查)≠ find(非主键查),避免混用。

3.4 变量与方法参数

成员变量、局部变量、方法参数均采用小驼峰命名法,使用名词命名,保证语义清晰。

  1. 除循环场景下临时使用i、j、k外,其余变量禁止使用单个字母命名。

  2. 禁止使用m__等前缀修饰成员变量,依托现代化IDE提示功能,即可清晰区分变量类型,无需增加冗余标识。

  3. 实体类属性命名,禁止与数据库关键字冲突,避免SQL解析异常。

private String userName;
private Integer userAge;

public void createUser(String userName, Integer userAge) {
    String tempName = userName;
}

3.5 常量

static final修饰的常量,采用全大写字母+下划线分隔,下划线分隔单词,符合阿里规约强制要求。

  1. 常量名语义完整,体现常量含义与用途,禁止使用无意义常量名。

  2. 全局通用常量归集到公共常量类,业务常量归集到对应业务常量类或枚举类,避免分散定义。

public static final int MAX_PAGE_SIZE = 50;
public static final String DEFAULT_USER_AVATAR = "default.png";
public static final long EXPIRE_SECONDS = 3600L;

4 SpringBoot项目专项命名规范(结合阿里微服务与工程规约)

4.1 项目与模块命名

  1. 项目名称:统一使用全小写字母+短横线分隔,禁止使用驼峰、下划线、中文及特殊字符。示例:user-centerorder-serviceblog-admingateway-server

  2. 构建文件标识:Maven、Gradle的artifactId与项目名称完全一致;groupId遵循反向域名规则;版本号采用语义化版本规范,格式为主版本号.次版本号.修订号,如1.0.02.1.3,阿里规约不推荐在版本号中添加RELEASE等冗余后缀。

  3. 多模块项目:子模块命名沿用小写+短横线格式,按职责清晰划分,如user-center-apiuser-center-serviceuser-center-daouser-center-sdk

4.2 分层架构类命名

SpringBoot 项目遵循标准分层架构,各层级类采用固定后缀 + 统一命名规则,明确职责边界,符合阿里分层开发规约,全项目需严格统一执行:

4.2.1 控制层(Controller)

  • 命名规则业务领域名 + Controller(大驼峰),无冗余前缀 / 后缀;

  • 核心约束

  1. 仅负责请求接收、参数校验、结果返回,禁止包含业务逻辑;

  2. 网关、通用拦截器等非业务控制类除外,通用控制类可加 “Common” 前缀(如CommonExceptionController);

  3. 禁止使用 “Action”“Handler” 等替代 “Controller” 后缀;

  • 合规示例UserControllerOrderControllerGoodsController

  • 不合规示例UserAction(后缀错误)、UserManagerController(冗余前缀)、OrderApi(无标准后缀)。

4.2.2 业务逻辑层(Service)

  • 接口命名业务领域名 + Service(大驼峰),禁止加 “I” 前缀(如IUserService),团队统一即可;

  • 实现类命名业务领域名 + Service + Impl(大驼峰),“Impl” 为固定后缀;

  • 核心约束

  1. 一个业务接口仅对应一个核心实现类,禁止多个 Impl 对应同一接口(特殊场景需加场景后缀,如UserServiceV2Impl);

  2. 通用业务类可加 “Common” 前缀(如CommonUserService),禁止无意义命名(如BaseService);

  • 合规示例

  1. 接口:UserServiceOrderService

  2. 实现类:UserServiceImplOrderServiceImpl

  • 不合规示例IUserService(冗余 I 前缀)、UserServiceImp(后缀拼写错误)、OrderBusiness(无标准后缀)。

4.2.3 数据访问层

  • MyBatis/MyBatis-Plus 环境

  • 命名规则:业务领域名 + Mapper(大驼峰);

  • 约束:仅负责数据库 CRUD 操作,禁止包含业务逻辑;Mapper 接口与 XML 文件名称完全一致;

  • 示例:UserMapperOrderMapper

  • JPA 环境

  • 命名规则:业务领域名 + Repository(大驼峰);

  • 约束:禁止混用 “Mapper” 和 “Repository” 后缀,同一项目仅选其一;

  • 示例:UserRepositoryOrderRepository

  • 不合规示例UserDao(非标准后缀)、OrderMapperRepository(后缀混用)、UserMapperImpl(无需实现类后缀)。

4.2.4 数据传输对象(DTO/VO/BO)

通用规则

  1. 大驼峰命名,后缀仅允许使用 DTO/VO/BO,禁止自定义(如 TO/PO)或混用大小写(如 UserDto);

  2. 命名格式:业务领域名 + 功能/场景描述(可选) + 后缀,功能描述需精准体现用途。

各类型具体规则

类型

核心用途

命名规则

合规示例

不合规示例

DTO

接收前端请求参数

业务名 + 操作类型 + DTO

UserSaveDTO、OrderQueryDTO

UserParam、OrderReqDTO

VO

向前端返回视图数据

业务名 + 场景(可选) + VO

UserVO、OrderDetailVO

UserView、OrderInfoDTO

BO

业务层内部数据传递

业务名 + 业务场景 + BO

UserLoginBO、OrderSettleBO

UserBusiness、OrderBOImpl

  • 约束:禁止 VO/DTO 包含业务逻辑,全项目仅使用一套后缀规则。

总结

  1. 分层类命名核心是 “业务领域名 + 固定后缀”,Controller/Service/Mapper/Repository 为层级固定后缀,Impl 仅用于 Service 实现类;

  2. 数据传输对象后缀仅允许 DTO/VO/BO,DTO 按操作类型、VO 按展示场景、BO 按业务场景补充描述;

  3. 全项目禁止混用后缀(如 Dao/Mapper、Req/DTO)、禁止自定义非标准后缀,确保命名语义唯一、职责清晰。

4.3 接口路径与请求方法

接口设计严格遵循RESTful风格,对标阿里接口开发规范:

  1. 接口路径采用全小写字母+短横线分隔,禁止使用驼峰、下划线。

  2. 请求方法与业务操作严格对应,禁止全部使用POST请求:GET用于查询、POST用于新增、PUT用于全量更新、PATCH用于局部更新、DELETE用于删除。

  3. 接口路径简洁明了,不暴露业务细节与实现逻辑,禁止在路径中使用动词。

4.4 配置相关命名

  1. 配置类:统一以Config为后缀,如MybatisConfigWebMvcConfigRedisConfigThreadPoolConfig

  2. 配置属性类:使用@ConfigurationProperties注解的类,添加Properties后缀,如MinioPropertiesOssPropertiesThreadPoolProperties

  3. 配置文件:

  • 主配置文件统一使用application.yml,优先使用YAML格式,弃用properties格式,提升可读性与层级感,符合阿里推荐规范。

  • 多环境配置文件遵循application-{环境标识}.yml规则,环境标识使用devtestpreprod,对应开发、测试、预发、生产环境。

  • 配置项key采用全小写字母+短横线分隔,可与代码小驼峰格式自动映射,禁止使用大写与下划线。

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: root
  redis:
    host: localhost
    port: 6379

mybatis:
  mapper-locations: classpath:mapper/*.xml

4.5 Bean与组件命名

  1. 使用@Service@Component@Repository@Controller等注解声明组件时,无需手动指定value属性,Spring框架默认以类名首字母小写作为Bean名称,如userServiceuserMapper,避免手动指定引发命名冲突。

  2. 手动注册Bean时,配置方法采用小驼峰命名,方法名即为Bean名称,一个配置类中避免注册多个同名Bean。

@Configuration
public class ThreadPoolConfig {
    @Bean
    public ExecutorService threadPoolTaskExecutor() {
        // 线程池初始化逻辑
    }
}

4.6 定时任务与异步方法

  1. 定时任务方法:采用小驼峰命名,统一以Task结尾,如userCleanTask()orderTimeoutTask(),定时任务类可添加ScheduleTask后缀。

  2. 异步方法:配合@Async注解使用,统一添加Async后缀,如sendMessageAsync()saveLogAsync(),方便识别与维护。

5 项目文件及目录规范(阿里工程规约适配)

  1. 源码目录:业务代码固定存放于src/main/java,配置文件、静态资源、Mapper XML等资源文件存放于src/main/resources,测试代码存放于src/test/java

  2. 静态资源目录:resources/static用于存放前端静态资源,resources/templates用于存放服务端模板页面,无前后端不分离场景可精简。

  3. MyBatis映射文件:统一归集至resources/mapper目录,文件名与对应Mapper接口完全一致,如UserMapper.xml,禁止随意存放、命名混乱。

  4. 日志文件:禁止存放于项目源码目录,通过配置统一输出至服务器独立日志目录,日志文件名使用项目名-服务名-日期.log格式,按天滚动,符合阿里日志规范。

  5. 测试代码:src/test/java目录下的包结构,需与主业务代码完全一致;测试类统一以Test结尾,如UserControllerTestUserServiceTest,单元测试、集成测试分类管理。

6 强制禁止项与常见违规说明(对标阿里规约强制条款)

  1. 严禁拼音命名:禁止使用中文拼音、拼音缩写命名,如YongHuDingDanyhgl,所有命名必须使用标准英文。

  2. 严禁魔法值:禁止在代码中硬编码固定数值、状态码、字符串等魔法值,所有固定常量必须通过常量类或枚举类统一维护,如禁止if(status == 1),应改用if(OrderStatusEnum.PENDING.getCode().equals(status))

  3. 严禁命名风格混用:项目内代码、接口路径、配置文件、数据库相关命名,不得同时出现小驼峰、下划线、短横线混用的情况。

  4. 严禁无意义命名:杜绝tempstringmaplist等无法表达业务含义的命名,方法、变量命名必须体现用途。

  5. 严禁冗余与过度封装:禁止随意创建Service、DTO、工具类,避免层级混乱、类名冗长;禁止重复定义常量、枚举。

  6. 严禁遗留无效代码:测试代码、临时调试代码、废弃注释、无效代码,在代码提测、上线前必须清理,不允许带入生产环境。