1、 springboot简介

springboot是什么?

众所周知 Spring 应用需要进行大量的配置,各种 XML 配置和注解配置让人眼花缭乱,且极容易出错,因此 Spring 一度被称为“配置地狱”。

为了简化 Spring 应用的搭建和开发过程,Pivotal 团队在 Spring 基础上提供了一套全新的开源的框架,它就是 Spring Boot。

Spring Boot 具有 Spring 一切优秀特性,Spring 能做的事,Spring Boot 都可以做,而且使用更加简单,功能更加丰富,性能更加稳定而健壮。随着近些年来微服务技术的流行,Spring Boot 也成为了时下炙手可热的技术

特征

Spring Boot 具有以下特点:

1. 独立运行的 Spring 项目

Spring Boot 可以以 jar 包的形式独立运行,Spring Boot 项目只需通过命令“ java –jar xx.jar” 即可运行。

2. 内嵌 Servlet 容器

Spring Boot 使用嵌入式的 Servlet 容器(例如 Tomcat、Jetty 或者 Undertow 等),应用无需打成 WAR 包 。

3. 提供 starter 简化 Maven 配置

Spring Boot 提供了一系列的“starter”项目对象模型(POMS)来简化 Maven 配置。

4. 提供了大量的自动配置

Spring Boot 提供了大量的默认自动配置,来简化项目的开发,开发人员也通过配置文件修改默认配置。

5. 自带应用监控

Spring Boot 可以对正在运行的项目提供监控。

6. 无代码生成和 xml 配置

Spring Boot 不需要任何 xml 配置即可实现 Spring 的所有配置。

starter

Spring Boot 将日常企业应用研发中的各种场景都抽取出来,做成一个个的 starter(启动器),starter 中整合了该场景下各种可能用到的依赖,用户只需要在 Maven 中引入 starter 依赖,SpringBoot 就能自动扫描到要加载的信息并启动相应的默认配置。

starter 提供了大量的自动配置,让用户摆脱了处理各种依赖和配置的困扰。所有这些 starter 都遵循着约定成俗的默认配置,并允许用户调整这些配置,即遵循“约定大于配置”的原则。

配置文件

Spring Boot 提供了大量的自动配置,极大地简化了spring 应用的开发过程,当用户创建了一个 Spring Boot 项目后,即使不进行任何配置,该项目也能顺利的运行起来。当然,用户也可以根据自身的需要使用配置文件修改 Spring Boot 的默认设置.

SpringBoot 默认使用以下 2 种全局的配置文件,其文件名是固定的。

  • application.properties

  • application.yml

默认配置文件

Spring Boot 项目中可以存在多个 application.properties 或 apllication.yml。

Spring Boot 启动时会扫描以下 5 个位置的 application.properties 或 apllication.yml 文件,并将它们作为 Spring boot 的默认配置文件。

  1. file:./config/*/

  2. file:./config/

  3. file:./

  4. classpath:/config/

  5. classpath:/

多环境配置

在实际的项目开发中,一个项目通常会存在多个环境,例如:开发环境、测试环境和生产环境等。不同环境的配置也不尽相同,例如开发环境使用的是开发数据库,测试环境使用的是测试数据库,而生产环境使用的是线上的正式数据库等。

Profile 为在不同环境下使用不同的配置提供了支持,我们可以通过激活、指定参数等方式快速切换环境。

多 Profile 文件方式

Spring Boot 的配置文件共有两种形式:.properties 文件和 .yml 文件。

不管哪种形式,它们都能通过文件名的命名形式区分出不同的环境的配置,文件命名格式为:

  • application-{profile}.properties

  • application-{profile}.yml。

自动配置原理

自动配置是什么?

当我们使用 SpringBoot 开发应用时,通常会依赖许多第三方库,这些库需要进行配置才能使用,比如:数据库连接、消息队列、Redis、日志记录、缓存等。

SpringBoot的自动配置机制可以让我们无需手动进行繁琐的配置,只需要简单地引入相应的依赖库,SpringBoot就能够根据我们的依赖来自动配置对应的组件,大大减少了开发过程中的工作量,提高了开发效率。

thymeleaf简介

Thymeleaf 是新一代 Java 模板引擎,与 Velocity、FreeMarker 等传统 Java 模板引擎不同,Thymeleaf 支持 HTML 原型,其文件后缀为“.html”,因此它可以直接被浏览器打开,此时浏览器会忽略未定义的 Thymeleaf 标签属性,展示 thymeleaf 模板的静态页面效果;当通过 Web 应用程序访问时,Thymeleaf 会动态地替换掉静态内容,使页面动态显示.

1、Thymeleaf 的特点

Thymeleaf 模板引擎具有以下特点:

  • 动静结合:Thymeleaf 既可以直接使用浏览器打开,查看页面的静态效果,也可以通过 Web 应用程序进行访问,查看动态页面效果。

  • 开箱即用:Thymeleaf 提供了 Spring 标准方言以及一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。

  • 多方言支持:它提供了 Thymeleaf 标准和 Spring 标准两种方言,可以直接套用模板实现 JSTL、 OGNL 表达式;必要时,开发人员也可以扩展和创建自定义的方言。

  • 与 SpringBoot 完美整合:SpringBoot 为 Thymeleaf 提供了的默认配置,并且还为 Thymeleaf 设置了视图解析器,因此 Thymeleaf 可以与 Spring Boot 完美整合

2、标准表达式语法

Thymeleaf 模板引擎支持多种表达式:

  • 变量表达式:${...}

  • 选择变量表达式:*{...}

  • 链接表达式:@{...}

  • 国际化表达式:#{...}

  • 片段引用表达式:~{...}

变量表达式

使用 ${} 包裹的表达式被称为变量表达式,该表达式具有以下功能:

  • 获取对象的属性和方法

  • 使用内置的基本对象

  • 使用内置的工具对象

使用内置的基本对象

使用变量表达式还可以使用内置基本对象,获取内置对象的属性,调用内置对象的方法。 Thymeleaf 中常用的内置基本对象如下:

  • #ctx :上下文对象;

  • #vars :上下文变量;

  • #locale:上下文的语言环境;

  • #request:HttpServletRequest 对象(仅在 Web 应用中可用);

  • #response:HttpServletResponse 对象(仅在 Web 应用中可用);

  • #session:HttpSession 对象(仅在 Web 应用中可用);

  • #servletContext:ServletContext 对象(仅在 Web 应用中可用)

选择变量表达式

选择变量表达式与变量表达式功能基本一致,只是在变量表达式的基础上增加了与 th:object 的配合使用。当使用 th:object 存储一个对象后,我们可以在其后代中使用选择变量表达式({...})获取该对象中的属性,其中,“”即代表该对象。

<div th:object="${session.user}" >
    <p th:text="*{fisrtName}">firstname</p>
</div>

链接表达式

不管是静态资源的引用,还是 form 表单的请求,凡是链接都可以用链接表达式 (@{...})。

链接表达式的形式结构如下:

  • 无参请求:@{/xxx}

  • 有参请求:@{/xxx(k1=v1,k2=v2)}

例如使用链接表达式引入 css 样式表,代码如下。

<link href="asserts/css/signin.css" th:href="@{/asserts/css/signin.css}" rel="stylesheet">

3、th 属性

Thymeleaf 还提供了大量的 th 属性,这些属性可以直接在 HTML 标签中使用,其中常用 th 属性及其示例如下表。

属性描述示例
th:id替换 HTML 的 id 属性<input id="html-id" th:id="thymeleaf-id" />
th:text文本替换,转义特殊字符<h1 th:text="hello" >hello</h1>
th:object在父标签选择对象,子标签使用 *{…} 选择表达式选取值。 没有选择对象,那子标签使用选择表达式和 ${…} 变量表达式是一样的效果。 同时即使选择了对象,子标签仍然可以使用变量表达式。<div th:object="${session.user}" > <p th:text="*{fisrtName}">firstname</p></div>
th:value替换 value 属性<input th:value = "${user.name}" />
th:style设置样式<div th:style="'color:#F00; font-weight:bold'">hello</div>
th:onclick点击事件<td th:onclick = "'getInfo()'"></td>
th:each遍历,支持 Iterable、Map、数组等。<table> <tr th:each="m:${session.map}"> <td th:text="${m.getKey()}"></td> <td th:text="${m.getValue()}"></td> </tr></table>
th:if根据条件判断是否需要展示此标签<a th:if ="${userId == collect.userId}">
th:switch与 Java 的 switch case语句类似 通常与 th:case 配合使用,根据不同的条件展示不同的内容<div th:switch="${name}"> <span th:case="a">aa</span> <span th:case="b">bb</span></div>
th:src替换 HTML 中的 src 属性<img th:src="@{/asserts/img/bootstrap-solid.svg}" src="asserts/img/bootstrap-solid.svg" />
th:action替换表单提交地址<form th:action="@{/user/login}" th:method="post"></form>

跨域

1. 跨域怎么理解

跨域是什么?

 跨域是指不同域名之间的相互访问,这是由浏览器的同源策略决定的,是浏览器对JavaScript施加的安全措施,防止恶意文件破坏。

同源策略:同源策略是一种约定,它是浏览器最核心的也是最基本的安全策略,如果缺少了同源策略,则浏览器的正常功能可能会受到影响。 所谓同源就是说协议域名端口号完全一致,有一个不一致就会造成跨域问题。

跨域原理:

  • 跨域请求能正常发出去,服务端能接受到请求并正常返回结果,只是结果被拦截了。

  • 跨域只存在于浏览器,不存在于其他平台,比如安卓/java/ios等平台。

  • 之所以会发生跨域是因为受到了同源策略的限制,同源策略要求源相同才能进行正常通信,即协议,域名,端口号都完全一致。

URL :统一资源定位符,它是www的统一资源定位标志,也就是我们说的网络地址。它的一般格式为:协议类型://服务器地址:端口号/路径。 这也就是我们说的跨域中的域。

2、SprinBoot中跨域的三种解决方法

跨域技术CORS

 CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

 SpringBoot 就对Cross 做了很好的支持。目前有三种跨域方式。

日志配置及输出

日志配置及输出

Spring Boot 默认使用 SLF4J+Logback 记录日志,并提供了默认配置,即使我们不进行任何额外配,也可以使用 SLF4J+Logback 进行日志输出

日志级别

日志的输出都是分级别的,当一条日志信息的级别大于或等于配置文件的级别时,就对这条日志进行记录。

常见的日志级别如下(优先级依次升高)。

序号日志级别说明
1trace追踪,指明程序运行轨迹。
2debug调试,实际应用中一般将其作为最低级别,而 trace 则很少使用。
3info输出重要的信息,使用较多。
4warn警告,使用较多。
5error错误信息,使用较多。

输出格式

我们可以通过以下常用日志参数对日志的输出格式进行修改,如下表。

序号输出格式说明
1%d{yyyy-MM-dd HH:mm:ss, SSS}日志生产时间,输出到毫秒的时间
2%-5level输出日志级别,-5 表示左对齐并且固定输出 5 个字符,如果不足在右边补 0
3%logger 或 %clogger 的名称
4%thread 或 %t输出当前线程名称
5%p日志输出格式
6%message 或 %msg 或 %m日志内容,即 logger.info("message")
7%n换行符
8%class 或 %C输出 Java 类名
9%file 或 %F输出文件名
10%L输出错误行号
11%method 或 %M输出方法名
12%l输出语句所在的行数, 包括类名、方法名、文件名、行数
13hostName本地机器名
14hostAddress本地 ip 地址

带有 spring 标识的日志配置文件

Spring Boot 推荐用户使用 logback-spring.xml、log4j2-spring.xml 等这种带有 spring 标识的配置文件。这种配置文件被放在项目类路径后,不会直接被日志框架加载,而是由 Spring Boot 对它们进行解析,这样就可以使用 Spring Boot 的高级功能 Profile,实现在不同的环境中使用不同的日志配置。

定时任务

下订单:30分钟以内实现付款功能 。下订单:开始定时任务;是否付款,没有付款,取消订单;

数据库:定时清理,统计

1、使用Schedule实现定时任务

@Scheduled注解是Spring框架提供的一种定时任务调度功能,可以在指定的时间间隔内周期性调度运行方法。下面是对其注解参数的详细介绍:

  • fixedRate:设置定时任务的周期,以毫秒为单位,即每隔多长时间执行一次任务,不考虑任务执行的耗时;

  • fixedDelay:在上一个任务执行完毕后,等待一段时间后再执行下一个任务,以毫秒为单位,即每次任务执行之间的时间间隔;

  • initialDelay:指定初始化延迟时间,以毫秒为单位,即在Spring容器启动后,延迟多少时间执行定时任务;

  • cron:常用的Cron表达式,用于指定更为复杂、精细的时间规则。

Cron表达式:

Cron表达式是一种常用的时间定时规则表达式,它由6个字段组成,用来描述定时任务的执行时间规则。

Cron表达式的格式为:

秒 分 时 日 月 周

每个字段的含义如下:

  1. :表示秒,取值范围为0~59;

  2. :表示分,取值范围为0~59;

  3. :表示时,取值范围为0~23;

  4. :表示天,取值范围为1~31;

  5. :表示月,取值范围为1~12;

  6. :表示星期,取值范围为0~7,其中0和7均表示星期日;

除了这6个字段以外,Cron表达式还支持特殊字符和区间表达式,具体如下:

  1. 通配符(*):表示该字段的所有可能取值;

  2. 区间表达式(-):表示该字段的取值范围;

  3. 枚举表达式(,):表示该字段的多个取值;

  4. 互斥表达式(/):表示该字段的增量取值,例如0/15表示从0开始,每隔15秒执行一次;

  5. 表达式单元(?L):?通常用于表示周字段和日字段不确定,L通常用于表示最后一个,例如L3表示本月最后一个星期三;

  6. 非固定的值格式(W#):W通常用于表示该月的最后一个周几,例如10W表示该月最后一个周三,而#通常用于表示每月的第几个周几,例如2#3表示每月第二个星期三。

使用quartz实现定时任务

Quartz是一个常用的Java定时任务调度框架,用于在固定的时间点或固定的时间间隔内周期性地执行任务。Quartz提供了许多灵活多样的配置和定制选项,同时Quartz具有高可靠性、高度可配置和可伸缩性等特点,具备了在企业级环境中应用的条件。

Quartz有3个核心要素:调度器(Scheduler)、任务(Job)、触发器(Trigger)。

  1. Job(任务):是一个接口,有一个方法void execute(),可以通过实现该接口来定义需要执行的任务(具体的逻辑代码)。

  2. JobDetail:Quartz每次执行job时,都重新创建一个Job实例,会接收一个Job实现类,以便运行的时候通过newInstance()的反射调用机制去实例化Job.JobDetail是用来描述Job实现类以及相关静态信息,比如任务在scheduler中的组名等信息。

  3. Trigger(触发器):描述触发Job执行的时间触发规则实现类SimpleTrigger和CronTrigger可以通过crom表达式定义出各种复杂的调度方案。

  4. Calendar:是一些日历特定时间的集合。一个Trigger可以和多个 calendar关联,比如每周一早上10:00执行任务,法定假日不执行,则可以通过calendar进行定点排除。

  5. Scheduler(调度器):代表一个Quartz的独立运行容器。Trigger和JobDetail可以注册到Scheduler中。Scheduler可以将Trigger绑定到某一JobDetail上,这样当Trigger被触发时,对应的Job就会执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job

整合Swagger

OpenAPI规范(OAS)

OpenAPI 规范(OAS)定义了一个标准的、语言无关的 RESTful API 接口规范,它可以同时允许开发人员和操作系统查看并理解某个服务的功能,而无需访问源代码,文档或网络流量检查(既方便人类学习和阅读,也方便机器阅读)。正确定义 OAS 后,开发者可以使用最少的实现逻辑来理解远程服务并与之交互。

此外,文档生成工具可以使用 OpenAPI 规范来生成 API 文档,代码生成工具可以生成各种编程语言下的服务端和客户端代码,测试代码和其他用例。

什么是Swagger?

Swagger 是一个用于生成、描述和调用 RESTful 接口的Web 服务。通俗的来讲,Swagger 就是将项目中所有(想要暴露的)接口展现在页面上,并且可以进行接口调用和测试的服务。

Swagger的3个重要作用:

  • 将项目中所有的接口展现在页面上,这样后端程序员就不需要专门为前端使用者编写专门的接口文档;

  • 当接口更新之后,只需要修改代码中的Swagger描述就可以实时生成新的接口文档了,从而规避了接口文档老旧不能使用的问题;

  • 通过 Swagger 页面,我们可以直接进行接口调用,降低了项目开发阶段的调试成本。

Swagger和SpringFox有啥关系?

Swagger 可以看作是一个遵循了 OpenAPI 规范的一项技术,而 springfox 则是这项技术的具体实现

MyBatisPlus简介

MyBatis-Plus (简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生

特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑

  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作

  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错

  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题

  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作

  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )

  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用

  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库

  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

更多推荐