Spring Boot 23 -- 代码规范

一、关于命名

1、项目命名

项目名使用小写英文单词,多个之间使用连字符 "-" ,例如 my-test

2、包命名

2.1、项目基本包

com.company.{项目英文名(较长时适当简化)}.{模块名(可选)}
例如:test 包命名为 com.dhsg.test

注意:包命名全为小写英文字母,不可以使用大写英文字母,不可以使用 "_"、"-" 等符号

2.2、模块
  • config:配置类
  • filter:过滤器
  • common:公共类,定义常量类,组件
  • enums:枚举类(由于 enum 是 java 的关键字,所以使用 enums)
  • entity:数据库相关的实体类
  • vo:数据模型类(参数模型,数据传输模型等)
  • controller:控制层接口
  • service:服务层接口
  • service.impl:服务层接口实现
  • mapper:数据库访问层接口
  • exception:异常
  • util:工具类

3、类命名

类名首字母大写,如果由多个单词组成,每个单词的首字母都要大写,也即大驼峰式命名法
例如:MyFirstClass.java

public class MyFirstClass{

}

注意:

  • 如果类名由多个单词组成,每个单词的首字母都要大写,包括第一个单词
  • 接口类名前面要加前缀 "I" ,例如服务层的一个接口类,IHelloService.java

4、变量命名

变量名首字母小写,如果由多个单词组成,则除了第一个单词其他每个单词的首字母都要大写,也即小驼峰式命名法
例如:String myName = "小驼峰式命名法";

5、常量命名

常量名全部大写,如果由多个单词组成,则每个单词直接用下划线 "_" 分隔
例如:public static final String SYSTEM_COLOR= "RED";

6、方法命名

同变量命名一样,使用小驼峰式命名法
例如:

public void myFunction(){

}

7、补充

  • 名称只能由字母、数字、下划线、$符号组成
  • 不能以数字开头
  • 名称不能使用 JAVA 中的关键字
  • 坚决不允许出现中文及拼音命名

二、关于日志

1、统一使用 slf4j 和 logback 完成日志功能

        <!-- slf4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>

        <!-- logback -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

2、输出日志格式

%boldGreen(%date{yyyy-MM-dd HH:mm:ss}) | %highlight(%-5level) | %cyan(%thread) | %magenta(%logger) | %n %msg %n%n

3、输出位置

统一将日志文件输出到项目根目录下的 log 文件夹

4、使用示例

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Example {

    private static final Logger logger = LoggerFactory.getLogger(Example.class);

    public void function(){
        
        logger.error("error");
        logger.warn("warn");
        logger.info("info");
        logger.debug("debug");
        logger.trace("trace");

    }

}

三、关于异常

四、关于接口

1、URL 命名

模板:URL = scheme://{domain}/{version}/{endpoint}/[?query][#fragment]

scheme:指底层用的协议,如 http、https、ftp
domain:服务器的 IP 地址或者域名,例如 https://api.example.com
version:版本,例如 https://api.example.com/v1/,另一种做法是,将版本号放在 HTTP 头信息中,但不如放入 URL 方便和直观。Github 采用这种做法。
endpoint:资源路径,表示 API 的具体网址,要为复数。举例来说,有一个 API 提供产品的信息,还包括各种订单和用户的信息,则它的路径应该设计成下面这样。

query:为发送给服务器的参数

  • ?limit=10:指定返回记录的数量。
  • ?offset=10:指定返回记录的开始位置。
  • ?page=2&per_page=100:指定第几页,以及每页的记录数。
  • ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。

fragment:锚点,定位到页面的资源,锚点为资源 id

补充:

  1. 正斜杠分隔符 "/" 必须用来指示层级关系。
  2. 应该使用连字符 "-" 来提高 URI 的可读性。
  3. URI 路径中首选小写字母。
  4. URI 路径名词均为复数,使用数据库表名加后缀 "s" 。
  5. POST 方式避免使用 URI 编码的参数,尽量保持 URI 的干净。

2、接口方法命名

根据该接口的方法类型来命名方法名,例如
当该接口的 URI 为 "/orders",则

  • GET:getOrders
  • POST:postOrders
  • PUT:putOrders
  • DELETE:deleteOrders

3、接口传参

根据该接口的方法类型来定义,例如

  • GET:

当参数含有层级关系的个时候,优先使用 "/" 分割传值方式,例如:
https://www.example.com/v1.1/products/{id值}

当有可选参数时候,使用 ?param1="xxx"&m2="xxx" 方式,例如:
https://www.example.com/v1.1/products?type="xxx"&name="xxx"

补充:
URI 保持简约层级风格,可以混合使用,比如查找某商户下的产品:
https://www.example.com/v1.1/products?type="xxx"&name="xxx"

  • POST:

Json 格式包装参数提交,body 携带参数数据,例如:

POST  https://www.example.com/v1.1/products

Content-Type: application/json;charset=utf-8
{
"type":"类型1",
"name":"产品名称1",
"price": 1000.00
}
  • PUT:

Json 格式包装参数提交,body 携带参数数据,例如。

PUT https://www.example.com/v1.1/products

Content-Type: application/json;charset=utf-8
{
"type":"类型1",
"name":"产品名称1",
"price": 1000.00
}
  • DELETE:

使用 "/" 分割传值方式,例如删除产品信息:
DELETE https://www.example.com/v1.1/products/{id} #

4、响应体格式

在 common 包下新建两个类

CommonResult.java

import lombok.Data;

import java.io.Serializable;

/**
 * 统一返回格式
 *
 * @author dhsg
 * @date 2019-10-14
 **/
@Data
public class CommonResult implements Serializable {

    /**
     * 返回状态,1表示成功,0表示失败
     */
    private int status;

    /**
     * 返回信息
     */
    private String message;

    /**
     * 返回实体数据json格式
     */
    private Object data;

    /**
     * 有参构造函数
     *
     * @param status  返回状态,1表示成功,0表示失败
     * @param message 返回信息
     * @param data    返回实体数据json格式
     */
    public CommonResult(int status, String message, Object data) {
        this.status = status;
        this.message = message;
        this.data = data;
    }

    /**
     * 无参构造函数
     */
    public CommonResult() {
    }

}

CommonResultUtil.java

/**
 * 统一返回工具类
 *
 * @author dhsg
 * @date 2019-10-14
 **/
public class CommonResultUtil {

    /**
     * 成功标识码
     */
    private static Integer SUCCESS_CODE = 1;

    /**
     * 失败标识码
     */
    private static Integer FAIL_CODE = 0;

    /**
     * 返回成功
     */
    public static CommonResult success() {
        return new CommonResult(SUCCESS_CODE, "", null);
    }

    /**
     * 返回成功,并带上信息和数据
     * @param message 返回信息
     * @param data    返回实体数据json格式
     */
    public static CommonResult success(String message, Object data) {
        return new CommonResult(SUCCESS_CODE, message, data);
    }


    /**
     * 返回失败
     */
    public static CommonResult fail() {
        return new CommonResult(FAIL_CODE, "", null);
    }

    /**
     * 返回失败,并带上信息
     * @param message 返回信息
     */
    public static CommonResult fail(String message) {
        return new CommonResult(FAIL_CODE, message, null);
    }

}

使用示例

return CommonResultUtil.success("查询成功", null);

5、接口注释

controller 层统一使用 swagger2 组件管理 rest 接口文档。

五、关于注释

1、类注释

在每个类前面必须加上类注释,注释模板如下:

/**
* 类的详细说明
*
* @author  类创建者姓名
* @date    创建日期 YYYY-MM-DD
*/

2、属性注释

在每个属性前面必须加上属性注释,注释模板如下:

/** 
* 提示信息 
*/

例如:

/** 
* 系统名称 
*/
private String systemName = null;

3、方法注释

在每个方法前面必须加上方法注释,注释模板如下:

/**
* 方法的详细使用说明
*
* @param  参数名 参数1的使用说明
* @return 返回结果的说明
* @throws 异常类型 注明从此类方法中抛出异常的说明
*/

例如:

    /**
     * 一个用于说明方法上如何注释的例子
     * @param param1 参数1说明
     * @param param2 参数2说明
     * @return 返回说明
     * @throws Exception 异常说明
     */
    public String myFunction(String param1,int param2) throws Exception{
        return null;
    }

4、方法内注释

在方法内部的代码上方使用单行或者多行注释,该注释根据实际情况添加。
例如:

    /**
     * 一个用于说明方法上如何注释的例子
     * @param param1 参数1说明
     * @param param2 参数2说明
     * @return 返回说明
     * @throws Exception 异常说明
     */
    public String myFunction(String param1,int param2) throws Exception{

        // 单行注释,控制台打印 param1
        System.out.println(param1);

        // 多行注释
        // 控制台打印 param2
        System.out.println(param2);
        return null;
    }

注意:一定要在代码的上方写注释,不可以追加在代码尾部,像下面的写法是不被允许的

System.out.println(param1); // 控制台打印 param1 

5、其他

  • 注释中的说明信息使用中文
  • 在开发过程中,常常有一些方法有了新的实现思路,但是还没完全做好,于是需要先把旧的方法注释一下。但是在开发好了之后,一定要记得还原或者删除这些不需要的代码,保持代码的整洁。

六、版本控制

1、拉取原则

  • 每日开始工作拉取
  • 提交之前拉取

2、提交原则

  • 提交代码必须构建成功(编译,打包成功)
  • 提交代码必须完整(不能漏掉一些文件)
  • 提交代码必须忽略到本地临时文件(target, logs, .idea, *.iml,dist 等)

3、提交注释

  • 使用中文填写注释
  • 注释要反映本次提交变更的情况,注释描述添加前缀,前缀如下
    【创建】 通常在项目创建时使用
    【新增】
    【修改】
    【删除】
    【修复-number】 修复 Bug 使用,number 是 Bug 编号
    例如:【新增】 新增一个控制器类 HelloController.java

七、项目管理

1、使用 maven 做项目管理

2、pom.xml 中新增依赖的时候,必须添加注释

例如:

        <!-- web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

3、所有微服务工程必须依赖父 maven 工程,作为父 maven 工程的子工程

4、关于一些依赖的版本,需要在父 maven 的 pom 文件中指定作为常量引用

5、项目结构

1 2 3 4 5
src/main/java -- 存放 java 文件 - - - -
- com.chinadci - - -
- - config - -
- - - XxxConfig.java -
- - common - -
- - - CommonXxx.java -
- - enums - -
- - - XxxEnum.java -
- - entity - -
- - - XxxEntity.java -
- - vo - -
- - - XxxVo.java -
- - controller - -
- - - XxxController.java -
- - service - -
- - - IXxxService.java -
- - service - -
- - - impl -
- - - - XxxServiceImpl.java
- - mapper - -
- - - IXxxMapper.java -
- - exception - -
- - - XxxException.java -
- - util - -
- - - XxxUtil.java -
- - XxxApplication.java -- 启动类 - -
src/main/test -- 存放测试类文件 - - - -
src/main/resources -- 存放配置文件 - - - -
- mapper - - -
- - XxxMapper.xml - -
- static -- 静态文件 - - -
- - xxx.js - -
- - xxx.css - -
- tempaltes - - -
- - xxx.html - -
- application.yml - - -
- bootstrap.yml - - -
- logback.xml - - -

八、开发环境

  • 开发环境:JDK 1.8+
  • 开发工具:IntelliJ IDEA 2018(安装 Lombok Plugin)
  • 构建工具:Maven 3.x
  • 代码管理工具:Git / TortoiseGit
  • Spring Cloud 版本:Finchley.RELEASE
  • Spring Boot 版本:2.0.3.RELEASE
  • Tomcat 版本:8
  • slf4j 版本:1.7.25
  • logback 版本:1.2.3
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • .Net 开发规范一、C# 编码规范1. 代码组织与风格1.1. Tab要使一个Tab为4个空格长。1.2. 缩进...
    PowerYangSoft阅读 3,949评论 0 3
  • 1.编码规范 1.1 编码格式与语法 项目默认编码格式统一为UTF-8格式,语法采用ES6+语法 1.2 代码注释...
    ZZES_ZCDC阅读 4,621评论 6 19
  • 1.编码规范 1.1 编码格式与语法 项目默认编码格式统一为UTF-8格式,语法采用ES6+语法 1.2 代码注释...
    中v中阅读 2,324评论 0 3
  • 推荐文章:禅与 Objective-C 编程艺 前言 为􏰀高产品代码质量,指导广大软件开发人员编写出简洁、可维护、...
    WolfTin阅读 2,755评论 0 1
  • roswtf工具的基本介绍 1 检查你的安装 roswft可以检查你的系统是不是有什么错误: 你会看到如下信息: ...
    Savior2016阅读 2,534评论 0 2