SpringBoot开发中的一些小细节(一)

SpringBoot开发中的一些小细节(一)

2018, Dec 14    

原来写的代码被CTO抓出来吐槽,发现确实都是一些当初自己没有注意到的地方,打算将这样的小细节一点一点的收集起来,养成更好的编码习惯。

Slf4j

The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired logging framework at deployment time. 摘自https://www.slf4j.org/

在编写Spring的代码的时候,只需要在Class上方添加一个@Slf4j的注解即可。slf4j是facade pattern的典型例子(隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口,又被成为门面模式或者外观模式) 使用的时候,可以使用占位符的方式进行日志的记录,省去了原来自己拼接日志的麻烦。

    log.debug("wxpushGet() returned: {}" ,result);

但是有一些需要注意的地方。

  • 在日常开发调试的时候应该少用log.info(),而应该使用log.debug,不然在上线之后,就会产生很多冗余的信息。
  • 只有在线上部署的时候,关键代码的信息,才使用log.info(),来显示日志的信息。千万不能滥用!
  • 在catch的抛出错误的时候,使用log.error()。会打印错误以及异常的信息
  • log.warn(),用于打印潜在的用户的错误可能的信息。

    Dto等model的@Data注解

    @Data注解,可以实现类的Getter和Setter的同时还有toString方法,没有必要自己再转一次Json(如果只是打印个日志的话),lombok生成的toString的可读性是很高的

    Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO Plain Ordinary Java Object)。它通过注解实现这一目的。

Rest的post和get

rest风格不是随便使用get的(这是一个前辈给我说的,有次看了不少相关的文章和介绍,包括get和post到底有什么区别)

REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。

今天前辈在看我的代码的时候,就问我为什么所有的都是get,说实话,当时的我真的是懵逼的。 我脑海中原来get和post区别大概如下:

  • get请求要比post快
  • get用户可以直接修改参数,post是将数据放在request body中,稍微安全一点
  • get一般是用来请求数据
  • post一般是用来发送数据

大概就是如上的内容了,然后在读完上面几篇文章后,又有了新的认识:

  • get在浏览器回退的时候是无害的,而post会再次请求(应该就是返回上一页面的时候,get秒回,post会重新请求)
  • get请求会被浏览器主动cache,而post不会,除非手动自己设置
  • get请求只支持url的编码,而post支持多种编码的方式
  • get请求的参数会被留在浏览器的历史记录当中,但是post不会
  • get请求的参数有长度限制,但是post没有
  • get只接受ASCII字符,而post没有限制
  • get的参数会直接暴露在url上,因此不能用来传递敏感的信息
  • get的参数通过url来传递,而post是直接放在request body当中的

上面的很多标准答案的概念,其实都是慢慢的通过人员长期使用形成了一部分思维定式,上面的文章之一的观点就有不同的见解:

  • 给post加上url传参,给get加上request body,在技术上都是可以实现的,只是不能通过浏览器实现,但是并不是所有的网络服务都是通过浏览器来的
  • 两者都是单纯的源于http协议,只有一丁点根本的区别,一个用于获取数据,一个用于修改数据
  • get的长度限制,主要是浏览器服务器等,为了防止一些黑客的攻击来进行的限制,和get、post的无关。
  • 可以在get的车里放data,也可以在post车外面放data,但是这样很蠢

64122226.png 64276701.png