《微服务架构实战》读书笔记三—SpringBoot

springboot是什么?

springboot是为了简化spring的开发过程,通过少量代码就能创建一个独立的,产品级spring应用

springboot的核心思想是约定大于配置,基本不需要写配置文件,或者写少量配置即可

特点

  • 方便创建独立的spring应用,为基于spring的开发框架提供更快的入门体验
  • 内置tomcat,无需生成war文件
  • 简化maven配置
  • 自动配置spring,更快,更方便地与第三方应用结合,比如消息队列、缓存等
  • 提供大型项目中非功能特性,如指标,安全,健康检查及外部配置
  • 开箱即用,无需代码生成,无需xml配置。同时可以修改默认值来满足特定功能

四大神器

  • 自动配置,基于类路径检测的方法,自动为运行中的应用配置依赖关系,不需要而外提供XML配置
  • Starters,提供一组pom starters依赖关系,springboot熟知怎么配置这些依赖关系,同时能组织扩展springboot来配置自定义的依赖关系
  • Actuator,可以提供运行状况检查和指标等生产就绪功能,这些功能通过springboot应用终端的rest提供,只需要简单配置即可实现强大的监控和检查
  • 开发工具,快速实现热部署

AOP

aop是面向切面编程,oop的延续

AOP把系统分为两个部分,核心关注点和横切关注点

核心是说业务流程,横切代表是与业务关注密切,但是和业务关系不大,如权限,日志,安全

aop的思想是通过代理的模式,把核心和横切分离开实现,代码之间不冗余在一起

AOP一些名词

  • 切面,一个关注点的模块化
  • 连接点,一个连接点代表一个方法的执行
  • 通知,在切面某个特定连接点上的执行的动作
  • 切入点,匹配连接点的断言
  • 引入,用来给一个类型声明额外的方法和属性
  • 目标对象,通知对象,被一个或多个切面通知的对象
  • AOP代理
  • 织入,把切面连接到其他应用程序对象上

AOP通知类型

  1. 前置通知,在一个方法前执行被切面的通知
  2. 后置返回通知,在一个方法执行后正常完成后执行
  3. 后置异常通知,在一个方法执行后出现异常后执行
  4. 后置最终通知,一个方法无论是否正常还是异常结束均执行
  5. 环绕通知,包围在一个连接点的通知

持久化

Springboot把持久化集成变成了一项非常简单的任务,因为它具有自动配置Spring Data 以访问数据库的能力,只需要工程中将Spring-boot-starter-data-jpa包含进来。

Spring Data JPA 是Spring为Jpa提供的一套实现,可以极大地简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据库的访问和操作,除了CRUD外一些常用的分页,排序等一些功能,通过定义方法名的规范,即可实现相应的功能

事务处理

事务的属性

  • 原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;

  • 一致性(Consistent):事务结束后系统状态是一致的;

  • 隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;

  • 持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。

事务的传播类型

事务传播行为类型 说明
PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

并发引起的问题

  • 幻读(Phantom Read):事务A重新执行一个查询,返回一系列符合查询条件的行,发现其中插入了被事务B提交的行。
  • 不可重复读(Unrepeatable Read):事务A重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务B修改过了。
  • 脏读(Dirty Read):A事务读取B事务尚未提交的数据并在此基础上操作,而B事务执行回滚,那么A读取到的数据就是脏数据。

Springboot对事务的集成

@Transactional注解即可,可以在方法上也可以在类上,在类上表示所有的public的方法都是开启事务,如果类和方法都使用了这个注解,类上的注解会重载方法级别上的注解

懒人的接口文档管理

SpringBoot提供了非常好的接口文档管理插件Swagger,完美集成

Swagger是一个规范和完整的框架,用于生成。描述,调用,和可视化Restful 风格的web服务

常用注解:

  • @Api()用于类;
    表示标识这个类是swagger的资源
  • @ApiOperation()用于方法;
    表示一个http请求的操作
  • @ApiParam()用于方法,参数,字段说明;
    表示对参数的添加元数据(说明或是否必填等)
  • @ApiModel()用于类
    表示对类进行说明,用于参数用实体类接收
  • @ApiModelProperty()用于方法,字段
    表示对model属性的说明或者数据操作更改
  • @ApiIgnore()用于类,方法,方法参数
    表示这个方法或者类被忽略
  • @ApiImplicitParam() 用于方法
    表示单独的请求参数
  • @ApiImplicitParams() 用于方法,包含多个 @ApiImplicitParam