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

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

2019, Jan 05    

Code Review

这一周主要是一个前辈的code Review,在此期间能学到很多新的东西,也能看到自己的不足

变量名的命名

禁止使用拼音,真的显得很没有水平,而且可读性会非常差,除非这个对象真的只有拼音名字

关于异常的抛出

  • 异常不要怕抛出的多,有异常一定要打出来,不然出了错都不知道是什么地方出的错
  • 禁止一个Exception就把一大段代码的所有异常给吞了
  • 异常一定要用log.error()将栈给打出来

StringBuffer、StringBuilder和String

运行速度:执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String

String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。

String str="abc"+"de";
StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");
System.out.println(str);
System.out.println(stringBuilder.toString());

这种情况下除外,String的速度会比StringBuilder要快,因为第一行等价于String str=”abcde”。

在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的

如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

使用的情况

String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

代码复用性

都是http的请求的话,封装成一个功能函数就好了,不用每次都写一个http的函数,复用性太低。而且最好的方式是使用feign的方式,更加的漂亮

正则和alike有什么区别吗?

好像用alike好一点,但是mongo里面好像只有正则,其实都可以

Stream流的方式

主要用在将一个list转成另外一个list或者map转map的时候用的,入参一个,出参一个 list.stream().map()使用java的,都能实现,主要是map可以不用写那么多代码。map(CustomVersion::new).collect(Collectors.toList()); 这个new 就是要创造一个传入的参数的构造函数

数据库的CRUD

查询的时候注意

不建议使用findAll,最好做一个分页,看一下表有多大,除非是表小,而且不会有爆炸性的数据增长的时候可以用。其他时候最好都有分页

删除的时候

最好是确认了可以保存了,然后再去删,这个,不应该一来就删了

profile

想了解应用运行的状态,在什么环境下的,应该去看activity的profile

spring:
  profiles:
    active: debug

上面是在bootstrap.yml中的,下面是如何使用

@Value("${spring.profiles.active}")
String active;
log.info("start kubernetes watch,active:{}",active);

将mongoTemplate改为repo的形式

官方文档

相当的方便,好处就是出问题的时候,可以找到对应的表的对应的repo类,快速排查问题。
如果想要自定义函数的话,需要自定义一个接口,再实现之后,用repo来继承自定义的接口。
如果直接实现repo的接口的话,需要重写很多函数。

在实现的时候部分代码,记得加上上面的两个注解

@Repository
@RequiredArgsConstructor
public class CustomizeProjectRepoImpl implements CustomizeProjectRepo {
  @Autowired
  MongoTemplate mongoTemplate;
  @Override
  public void updateDeployToYesByIds(List<Integer> ids) {
      Query query = Query.query(Criteria.where("id").in(ids));
      Update update = Update.update("deployOrNot", YesOrNot.YES.getValue());
      mongoTemplate.updateMulti(query, update, CustomProject.class);
  }
}