1.返回给前端损失了.0 或者.00
转成字符串返回
JsonFormat(shape = JsonFormat.Shape.STRING)
2.starter
每一个 stater 都在扮演着提供我们所需的 Spring 特性的一站式商店角色。其他所需的依赖以一致的方式注入并且被管理。
冲突什么的 在starter中已经解决好了 不用管 引入进来就可以用了
写starter就设计到spi 需要写spring.factories
3.SPI
Springboot,通过 SPI加载配置文件的方式,把类加载到 spring 容器完成实例化
加载外部文件
导入得starter的包,一般都有自己的路径命名方式,不在当前项目的默认扫描路径下。
为了能方便使用者读到,都会配置spring.factories
利用springboot的自动配置
4.@Condition
5.@Import
@Import一个普通类 spring会将该类加载到spring容器中
我的理解:这个实体类本来不是一个被spring管理的bean,但是通过@import后,就是一个可以注入的bean
导入普通类:如果@Import的参数是普通类,则Spring会将该类实例化为一个Bean,并注册到容器中。
这种方式的使用场景是配置类无法被直接扫描到。
还有个注解,@ImportResource注解用于导入Spring的配置文件,让配置文件里面的内容生效。以前用过它导入xml文件
6.@DS实现多数据源
这篇博客看起来挺靠谱的
SpringBoot使用@DS配置 多数据源 【mybatisplus druid datasource mysql】_springboot配置双数据源 @ds-CSDN博客
不指定@DS的情况下,默认用主数据库
而且,也可以用jdbctemplate来切换多数据源,只要把@ds放到方法上就好,这时候方法内部查数据库的,走的都是@ds指定的那个数据源
7.代码优化注意点
1.能用基本类型就不要用它的封装类
2. 不要创建不必要的对象
避免无意中创建的对象,如自动装箱long->Long
3.组合胜过继承
4.可变参数要注意空
5.工具类中,集合型的不要返回Null
不然调用你方法的人还要自己判断一下空指针
6.log.error(str,throwable) 代替e.printStackTrace
7.用枚举代替常量
如图,枚举类里可以写一些方法
8.局部变量作用域最小化
在第一次使用的地方进行声明(虚拟机械一局部变量表 solt 槽)
局部变量都是要自行初始化,如果初始化的条件不满足,不要声明。
好处:减少局部变量表的关提高性能,避免局部变量过早使用导致的一些代码编写错误
9.精确计算,避免使用foat 和 double
Float 和 double在 JVM存储的时候,小数点,部分需要整数,有部分存储小数。所以精度有问题。要么用 int 或 long,BigDecimal
10.当心字符串连接的性能
“ 1111”+” time”+"asdasd”
如果要大量字符串拼接,SuingBufier,stingBuilder..
8.springboot内置tomat在哪
9.类加载器和双亲委派
类加载,把那些二进制字节码通过类加载器,加载到内存中,变成对象
双亲委派,那是为了防止破坏核心包,碰到个类就先问自己爹行不行,说不行,儿子才上
10.nginx
1.位置
外部访问--nginx--前端---springcloudgateway--转发到后端不同的服务
2. 惊群
惊群就是不排队,一有消息就通知所有人,疯抢
3.export和source要一起使用
export可以增加/修改 环境变量,source一下这个文件,就生效了
4.访问某个地址,不带端口号,默认就是80
5.监听路径相似时,会被匹配最长的拦下
6.正则匹配
正则覆盖
防止正则覆盖
7.nginx路径匹配流程