编写:bravo1988

开头提醒一句:打开你的IDEA跟着做。

部分IDEA可能会出现marketplace(插件应用商城)无法搜索的情况,应该是网络不稳定,可能需要翻墙。
如果实在无法在线下载,备用网盘:IDEA插件 密码:ype8
我的IDEA版本是2019.3。

  • 在线安装

可以直接在IDEA的Plugins下载,安装,重启。
image.png

  • 离线安装

image.png

image.png

image.png


Lombok

image.png
这个插件应该是必备的,配合Lombok依赖,可以用@Data、@AllArgsConstructor、@NoArgsConstructor等注解替代getter/setter、全参构造、无参构造,从而让代码变得非常简洁。

Lombok依赖

  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. </dependency>

用注解代替getter/setter、构造参数
image.png
@Data = getter/setter + toString() + equals() + hashCode()

一个@Data做了这么多事,并不一定是好事。尤其是hashCode(),有时我们并不需要对所有字段进行计算得到hashCode,此时就不宜用@Data自动生成的hashCode()。

我个人的建议是遵从最少依赖原则,你需要什么就加什么。但想偷懒就直接@Data,问题也不大。

有时我们需要私有构造器,也可以通过注解里的属性指定。
image.png
值得一提的是Lombok并不会减慢运行速度,因为@Data这些注解是在编译期解析的,底层字节码其实和手写getter/setter是一样的。

另外,Lombok还提供了日志注解@Slf4j,俗称“酸(S)辣(L)粉(F)”。原本我们如果要在程序中进行日志记录,需要这样:
image.png

使用@Slf4j:
image.png

有两点稍微注意一下:

  • 打日志时尽量别用字符串拼接,不够直观且效率低,应该使用{}占位符,用逗号隔开

image.png

  • @Slf4j只是门面,并没有实际的日志实现,所以Lombok的@Slf4j注解必须配合日志实现类,比如

image.png
当然,一般不需要特别注意,毕竟现在都用SpringBoot。

很多人不明白为什么System.out.println()也是打印输出,为什么会效率差?因为System.out.println()是调用系统资源的,而log只是JVM层面的,不涉及状态切换。

关于Lombok的其他用法可以参考:Lombok高级用法

Free MyBatis plugin

image.png
主要功能就是实现Mapper接口和Mapper.xml的跳转,还可以根据Mapper接口生成XML文件。但是随着通用Mapper、Mybatis-plus的使用,这插件变得比较鸡肋。当然,如果有些公司会强制查询语句必须手写SQL,此时Free MyBatis plugin就派上用场了。
图片.png
点击左边绿色箭头可以跳转到Mapper.xml文件。

另外,我们都知道Mapper接口的方法参数要是有多个时,必须加上@Param注解,可以用快捷键生成:
Kapture 2020-06-20 at 8.09.09.gif

Alibaba Java Coding Guidelines

image.png

这是与阿里巴巴团队出版的《阿里巴巴Java开发手册》配套的IDEA插件,可以实时检测代码规范,并给出基本的优化建议。

优点:

  • 帮助开发者养成良好的代码规范
  • 帮助开发团队形成统一的代码风格
  • 尽量减少因为不规范的代码而产生的bug

比如文档注释提醒:
图片.png

按提示写上注释:
图片.png

另外,阿里巴巴不推荐尾行注释
图片.png

改善:
图片.png
当然,如果字段很多,就会看起来太长了…而启用阿里巴巴规约插件后,你用//注释又会出现很难看的黄色警告,作为折中方案,可以这样写:
图片.png
因为JDK有时也这样写:
image.png
但写起来挺累的。

对了,阿里巴巴规约插件除了规范代码风格,还能对常见的代码给出优化建议:
图片.png
图片.png

甚至一些很小的细节(观察代码并思考结果):
image.png
类似Integer这些包装类内部设有缓冲区,所以建议包装类之间的比较尽量使用equals(),不要使用==。

用阿里巴巴编码插件后,平时多注意代码中的有色块提示,能帮我们规避很多错误。
image.png

如果你觉得这个规约提示有点烦,可以暂时关闭:
image.png

GsonFormat

image.png
GsonFormat主要用于把JSON字符串转为JavaBean。

使用场景:
当我们和外部系统对接时,调用第三方接口得到JSON数据后,希望在我们项目中创建对应的Bean来接收response结果时,这个插件就相当有用。

JSON结果:

{
    "code": 200,
    "message": "成功",
    "data": {
        "id": 199,
        "status": 1,
        "createTime": "2020-01-13T10:33:02.000GMT+08:00",
        "updateTime": "2020-01-13T10:33:21.000GMT+08:00",
        "isDelete": 1,
        "page": 1,
        "pageSize": 10,
        "userId": 49,
        "templetName": "测试模板",
        "templetId": 20,
        "resumeStyle": 3,
        "name": "bravo",
        "mobile": "182575xxxxx",
        "email": "52xxxxxxx@qq.com",
        "address": "杭州市西湖区"
    },
    "serverTime": 1579140259345
}

拷贝上面的JSON,打开IDEA,新建一个POJO:
image.png

image.png

还可以对字段进行调整:
image.png

点击“OK”,快速在当前POJO内部生成字段:
image.png

POJO to Json

image.png
与GsonFormat相反,这个插件用于POJO转JSON。

使用场景:
我们写完后端接口后,必须自测,以减少联调时不必要的bug。有时候我们的POJO实在太复杂,GET/DELETE请求还好,参数很简单,测一下也不是什么麻烦事。但是POST请求需要我们在Postman里写JSON,很多人往往嫌麻烦,就不测了。

比如:
image.png

把光标放在类名上,右键转化成JSON:
image.png

JSON内容会自动复制到剪贴板上,此时回到Postman黏贴JSON:
image.png补充参数后即可发送POST请求测试。

缺点:
对于级联Bean,由于会陷入递归操作,程序拒绝生成JSON:
image.png

提示错误:
image.png
如果后端使用Swagger2自动生成接口文档的话,可以直接在swagger做简单的测试,会方便很多。

RestfulToolKi

image.png
显示项目中所有Controller方法的URL,方便快速查找API接口,点击跳转方法

场景:
一个项目太大了,有时我们想寻找同事写的某个API接口所在的类,需要看接口文档或者double shift模糊搜索,而RestfulToolKi旨在帮助程序员快速定位API接口。
image.png

command+\还能调出搜索框:
image.png

实在太方便了!!
如果你还是喜欢Postman测试,可以方法名上右键复制URL,在参数类型类型上右键复制JSON数据。

拷贝URL:http://localhost:8080/insertSupermanimage.png

拷贝JSON:
image.png

{
    "id": 1,
    "name": "demoData",
    "open": true,
    "pid": 1,
    "level": 1,
    "children": {
        "id": 1,
        "name": "demoData",
        "open": true,
        "pid": 1,
        "level": 1
    }
}

然后就可以快乐地改bug了。

GenerateAllSetter

image.png
在我们new一个POJO后,帮助我们自动创建所有setter方法。

场景:
在实际开发中,我们经常需要在创建一个POJO后,为这个POJO设置所有字段(或部分)。于我而言,会担心是否存在有些字段忘了设置…此时这个插件就派上用场了。

把光标放在tipDto变量上,option+enter:
image.png

结果:
image.png

另外,Lombok其实有一种build模式:
image.png
已经设置的字段就不会在预选框里出现:
image.png
但是单纯从设置字段角度看,还是GenerateAllSetter方便。而且Lombok的builder模式有两个大坑:

  • 用了@Builder就无法使用new Person()这种无参构造了,别的同事不熟悉的话,会很烦
  • Controller返回结果时Person对象无法序列化为JSON

解决办法分别是:加@NoArgsConstructor、加@Setter(或者你本身有@Data)

个人还是很讨厌@Builder的,如果只是为了方便set数据,建议使用@Accessors(chain = true)

@Accessors(chain = true)
@Getter@Setter
public class LombokUser {
    private String name;
    private Integer age;
    private Integer height;
}

image.png
但@Accessors(chain = true)链式调用的缺点是set过的数据还是会出现在备选框里。

所以,为了这点鸡毛蒜皮的功能在那引入各种新注解,挺没意思的。GenerateAllSetter一键生成就好了,如果设置字段过多,链式set也不见得比普通的setter优雅多少。

MyBatis Log Plugin

image.png
根据控制台SQL的Log信息生成可执行SQL语句

场景:
测试时,我们发现一个接口结果不对,但是找了半天发现代码并没有什么错误,于是打算去数据库运行SQL,排查是否SQL语句本身有问题。此时,我们不得不在Navicat上面手写SQL,这样比较费时。

其实项目本身肯定有SQL的日志级别,比如:

# mapper
mybatis.mapper-locations=classpath:mapper/**/*.xml
logging.level.cn.wisejob.company=DEBUG

此时,控制台每次都会有SQL输出:
image.png

选中指定的SQL信息,右键生成可执行SQL语句:
image.png

拷贝即可:
image.png

在Navicat执行:
image.png