SpringBoot面试题

为什么SpringBoot的 jar可以直接运行?

详细参见:SpringBoot的 jar可以直接运行open in new window

SpringBoot自动装配过程及实现原理?

SpringBoot如何防止表单重复提交?

幂等性,通俗的说就是一个接口,多次发起同一个请求,必须保证操作只能执行一次。

需要幂等性的场景:

  • 订单接口,不能多次创建订单
  • 支付接口,重复支付同一笔订单只能扣一次钱
  • 支付宝回调接口,可能会多次回调,必须处理重复回调
  • 普通表单提交接口,因为网络超时、卡顿等原因多次点击提交,只能成功一次等等

常见的方案:

  • 从数据库方面考虑,数据设计的时候,如果有唯一性,考虑建立唯一索引

  • 从应用层面考虑,首先判断是单机服务还是分布式服务

    • 单机服务:考虑一些缓存Cache,利用缓存,来保证数据的重复提交
    • 分布式服务:考虑将用户的信息,例如token和请求的url进行组装在一起形成令牌,存储到缓存中,例如redis,并设置超时时间为**秒,如此来保证数据的唯一性(利用了redis的分布式锁)

解决方案大致总结如下:

  • 唯一索引:防止新增脏数据
  • token机制:防止页面重复提交,实现接口的幂等性校验
  • 分布式锁:redis(jredis、redisson)或zookeeper实现
  • 悲观锁:获取数据的时候加锁(锁表或锁行)
  • 乐观锁:基于版本号version实现,在更新数据那一刻校验数据
  • 状态机:状态变更,更新数据时判断状态

其中,前三种最为常见,更多内容可以参考:SpringBoot/Web项目防止表单/请求重复提交(单体和分布式)open in new window

如何自己写一个SpringBoot Starter?

参见:手把手教你写一个 Starteropen in new window