1、Spring Boot技术分享2019.3.15目 录目 录ONTENTSC1Spring Boot入门2Spring Boot初级应用3Spring Boot整合持久层4Spring Boot高级应用第一部分:Spring Boot入门1.Sprint Boot 简介2.Spring Boot 的优点3.Spring Boot 快速构建项目4.Spring Boot 入门HelloWorld1.1 Spring Boot简介Spring Boot 是在Spring(Spring4.0 版本)基础之上产生的,其中“Boot”的意思就是“引导”,意在简化开发模式,使开发者能够快速的开发出基于Sp
2、ring 的应用。Spring Boot 含有一个内嵌的Tomcat web容器。我们开发的web 应用不需要作为war包部署到web 容器中,而是作为一个jar 包,在启动时根据web 服务器的配置进行加载。Spring Boot 设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,并不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式。1.2 Spring Boot 的优点1.在没有使用Spring Boot 时构建项目时什么样的?u在项目中存在大量的xml 文件,配置相当繁琐u整合第三方框架时的配置jar包问题u低效的开发效率与部署效率问题2.Sp
3、ring Boot 解决了什么?u使配置简单u使编码简单u使部署简单1.3 Spring Boot 快速构建项目1.打开Spring Boot 的官网https:/spring.io/projects/spring-boot2.构建Spring Boot 的页面https:/start.spring.io/3.通过Spring Boot官方提供的启动器支持web全栈开发,提供了40+种启动器,jar包集中管理,解决jar包版本和依赖冲突问题。1.4 Spring Boot入门 HelloWorld1.新增一个controller,通过requestMapping注解映射url2.新增启动类:通
4、过SpringBootApplication注解标识。可以和 controller 位于同一个包下,或者位于 controller 的上一级包中。3.运行启动类:将应用程序打包,并自动部署到tomcat容器中。在浏览器输入 地址访问即可。第二部分:Spring Boot初级应用1.Spring Boot 项目目录结构2.Sprint Boot 核心注解3.Spring Boot 配置文件4.Spring Boot 视图层技术2.1 Spring Boot 项目目录结构src/main/java:java文件目录src/main/resource:存放静态资源文件的目录、配置文件、mybatis
5、映射文件、属性文件等src/test/java:测试代码目录。jdk 版本为1.8及以上2.2 Spring Boot 核心注解SpringBootApplication:代表是Spring Boot 的启动类。SpringBootConfiguration:通过bean对象来获取配置信息Configuration:通过对bean对象的操作替代spring 中xml 文件EnableAutoConfiguration:完成一些初始化环境的配置。ComponentScan:来完成spring 的组件扫描。替代之前我们在xml 文件中配置组件扫描的配置RestController:1,表示一个Co
6、ntroller。2,表示当前这个Controller 下的所有的方法都会以json 格式的数据返回。2.3 Spring Boot 配置文件1.properties配置文件:key=value的格式。key之间是以“.”进行分割2.yml 配置文件:是Spring Boot 中新增的一种配置文件格,以树状结构展示。ukey之间使用“:”进行分割u缩进一定不能使用tab键,否则会报错。uvalue和key中间的分号后面必须有一个空格3.多环境配置文件语法结构:application-profile.yml,profile:代表的就是一个环境变量 application-dev.yml 开发环境
7、 application-test.yml 测试环境 application-prod.yml 生产环境按环境加载配置文件运行项目u 控制台运行项目 java-jar xxx.jar-spring.profiles.active=profileu 新增一个全局配置文件application.yml文件,打包的时候通过active指定变量。2.4 Spring Boot 视图层技术1.整合 jsp;2.整合 freemarker;3.整合 thymeleaf:spring官方推荐的视图层技术,通过特定语法对 html 的标记做渲染。spring boot要求所有的静态资源都放在src/main/
8、resources/static目录下。要求模板形式的视图层技术的文件必须要放到 src/main/resources/templates,该目录是安全的,目录下的内容是不允许外界直接访问的。2.4 Spring Boot 视图层技术-Thymeleaf变量输出与字符串操作1.th:text在页面中输出值2.th:value可以将一个值放入到 input 标签的 value 中3.Thymeleaf 内置对象调用内置对象一定要用#大部分的内置对象都以 s 结尾 strings、numbers、datesu$#strings.isEmpty(key)判断字符串是否为空,如果为空返回 true,否
9、则返回 falseu$#strings.contains(msg,T)判断字符串是否包含指定的子串,如果包含返回 true,否则返回 falseu$#strings.startsWith(msg,a)2.4 Spring Boot 视图层技术-Thymeleaf变量输出与字符串操作u$#strings.startsWith(msg,a)判断当前字符串是否以子串开头,如果是返回 true,否则返回 falseu$#strings.endsWith(msg,a)判断当前字符串是否以子串结尾,如果是返回 true,否则返回 falseu$#strings.length(msg)返回字符串的长度u$#
10、strings.indexOf(msg,h)查找子串的位置,并返回该子串的下标,如果没找到则返回-1$#strings.substring(msg,13)u$#strings.substring(msg,13,15)截取子串,用法与 jdk String 类下 SubString 方法相同u$#strings.toUpperCase(msg)$#strings.toLowerCase(msg)字符串转大小写。2.4 Spring Boot 视图层技术-Thymeleaf日期格式化处理1.$#dates.format(key)格式化日期,默认的以浏览器默认语言为格式化标准2.$#dates.fo
11、rmat(key,yyy/MM/dd)按照自定义的格式做日期转换3.获取年、月、日$#dates.year(key)$#dates.month(key)$#dates.day(key)year:取年Month:取月Day:取日2.4 Spring Boot 视图层技术-Thymeleaf条件判断1.th:if 性别:男 性别:女2.th:switchID 为 1ID 为 2ID 为 32.4 Spring Boot 视图层技术-Thymeleaf迭代遍历 1.th:each 迭代list 2.Th:each 迭代map 2.4 Spring Boot 视图层技术-Thymeleaf域对象操作1
12、HttpServletRequestrequest.setAttribute(req,HttpServletRequest);Request:2.HttpSessionrequest.getSession().setAttribute(sess,HttpSession);Session:3.ServletContextrequest.getSession().getServletContext().setAttribute(app,Application);Application:2.4 Spring Boot 视图层技术-ThymeleafURL 表达式1.标签:th:href和th:sr
13、c2.基本语法:3.URL类型绝对路径 绝对路径相对路径:u相对于项目的上下文的相对路径:相对路径u相对于服务器路径的根:相对于服务器的根在 url 中实现参数传递 相对路径传参在 url 中通过 restful 风格进行参数传递 相对路径传参-restful第三部分:Spring Boot整合持久层1.Spring Boot项目工程搭建2.MyBatis逆向工程生成pojo和mapper文件3.MVC应用实现增删改查3.1 Spring Boot 项目工程搭建1.构建spring boot工程。2.增加mybatis启动器;mysql数据库驱动;druid连接池坐标。3.新增spring a
14、pplication配置数据库信息。3.2 MyBatis逆向工程生成pojo和mapper文件通过mybatis逆向工程生成对应的实体pojo、mapper接口和mapper xml文件通过通过mavenmaven命令命令:mybatis-generator:generate:mybatis-generator:generate生成代码生成代码拷贝拷贝generator.xmlgenerator.xml文件到文件到resourceresource目录,设置数据库、目录,设置数据库、文件文件包路径、表名和实体名对应关系等信息。包路径、表名和实体名对应关系等信息。在在pompom文件中引入文件中
15、引入mybatis-generatormybatis-generator插件。插件。3.3 MVC应用实现增删改查通过mvc分层实现用户信息的在web页面的增删改查操作新增service业务层实现业务逻辑。新增controller控制层实现请求转发和页面渲染新增view视图层展现数据,使用thymeleaf标签。导入项目启动,浏览器输入:http:/localhost:8081/add第四部分:Spring Boot高级应用1.Spring Boot数据校验2.Spring Boot全局事务3.Spring Boot异常处理4.Spring Boot整合junit单元测试5.Spring Bo
16、ot热部署6.Spring Boot定时任务7.Spring Boot logback日志记录器4.1 Spring Boot数据校验1.Spring Boot 对表单数据校验的技术特点,使用了 Hibernate-validate 校验框架。2.在 Controller 中开启对实体对象的校验,用valid注解;通过BindingResult接受校验结果。3.在pojo属性上增加相应的注解,举例:uNotNull 限制必须不为null。uNotEmpty:元素不为null且不为空(字符串长度不为0、集合大小不为0)。uNotBlank(message=“xxx不能为空):判断字符串是否为 n
17、ull 或者是空串(去掉首尾空格)。uLength(min=6,max=10,message=最小长度为6位,最大长度为10位):判断字符的长度(最大或者最小)uMin:判断数值最小值uMax:判断数值最大值uEmail:判断邮箱是否合法4.2 Spring Boot全局事务在编辑用户方法上声明事务Transactional,调用 mapper接口修改方法后,抛出异常,数据回滚未修改成功。反之如果没有声明事务,即使抛出异常,修改数据也不会回滚。Spring AOP即声明式事务管理默认是针对unchecked exception回滚,RuntimeException及其子类和错误(Error);
18、checked异常,即在编译期间就会检查必须捕获处理的不会回滚,如果想针对checked异常进行事务回滚,可以在注解里使用rollbackFor 属性明确指定异常回滚类型。Spring Boot开启申明式事务,只需要一个Transactional就可以。因为在SpringBoot 中已经默认对jpa和mybatis,hibernate开启了事务,在引入引用的时候自动就开启了事务。4.2 Spring Boot全局事务常见隐藏bug,业务层捕捉异常后,发现事务不生效。在业务层手工捕捉并处理了异常,异常被吃掉了,Spring不知道出现错误,所以不会回滚。推荐异常处理方法,在业务层统一抛出异常,然后
19、在控制层统一处理。使用spring boot全局异常处理机制。4.2 Spring Boot全局事务常用属性4.2 Spring Boot全局事务事务传播行为:所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。在TransactionDefinition定义中包括了如下几个表示传播行为的常量:PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。PROP
20、AGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED。4.2 Spring
21、 Boot全局事务声明全局事务,通过配置类注解Configuration+Bean完成Spring全局事务声明,后续事务就不需要在每个业务层的方法上通过注解开启事务。统一管理,简化代码。创建一个通知bean:定义声明事务的具体逻辑。创建一个建议者bean:包括切面和逻辑。定义切面并设置切点 pointcut,引用通知bean作为事务逻辑。4.3 Spring Boot异常处理1.自定义错误页面:默认的处理异常的机制,一旦程序中出现了异常会像/error 的 url 发送请求。默认BasicExceptionController 来处理/error 请求,然后跳转到默认显示异常的页面,可以自定义
22、error.html 页面。2.ExceptionHandler 注解:在Controller内部创建方法处理异常。该方法需要返回一个 ModelAndView,目的是封装异常信息以及视图的指定。3.ControllerAdvice+ExceptionHandler 注解:创建一个能够处理异常的全局异常类。在该类上需要添加ControllerAdvice 注解。Spring Boot 中对于异常处理提供了五种处理方式4.3 Spring Boot异常处理4.配置 SimpleMappingExceptionResolver 处理异常:在全局异常类中添加一个方法完成异常的统一处理,缺点不能将详细
23、的异常信息显示到页面。该方法返回值类型必须是SimpleMappingExceptionResolver。5.自定义 HandlerExceptionResolver 类处理异常:通过实现 HandlerExceptionResolver 接口做全局异常处理。4.4 Spring Boot整合junit单元测试1.添加junit环境的jar包2.Spring Boot测试类注解:uRunWith(SpringJUnit4ClassRunner.class):启动器,让 junit 与 spring 环境进行整合uSpringBootTest(classes=App.class):当前类为 sp
24、ring boot的测试类,加载 Spring Boot启动类。4.5 Spring Boot热部署自动重启原理在于spring boot使用两个classloader:不改变的类(如第三方jar)由base类加载器加载,正在开发的类由restart类加载器加载。应用重启时,restart类加载器被扔掉重建,而base类加载器不变,这种方法意味着应用程序重新启动通常比“冷启动”快得多,因为base类加载器已经可用并已填充。自动重启设置当我们开启devtools后,classpath中的文件变化会导致应用自动重启。Eclipse中保存文件即可引起classpath更新(注:),从而触发重启。ID
25、EA则需要自己手动CTRL+F9重新编译一下。排除静态资源需要打开自动编译静态资源文件在改变之后有时候没必要触发应用程序重启,例如thymeleaf模板文件就可以实时编辑,/templates下的资源不会触发重启,而是触发live reload(重新加载)。1.SpringLoader 插件(不推荐,2.0版本开始已经不支持该方式)2.spring-boot-devtools工具:4.5 Spring Boot热部署默认情况下,更改/META-INF/maven,/META-INF/resources,/resources,/static,/public 或默认设置spring.devtool
26、s.restart.exclude=static/*,public/*如果需要保留默认配置,同时增加新的配置,则可配置spring.devtools.restart.additional-exclude=templates/*观察额外的路径不在classpath中的路径的文件变化并触发重启,则可以配置spring.devtools.restart.additional-paths=xxx。LiveReloadDevTools内置了一个LiveReload服务,可以在资源变化时用来触发浏览器刷新。当然这个需要你浏览器安装了LiveReload插件,并且启动这个插件才行。4.6 Spring Bo
27、ot定时任务Scheduled Scheduled Scheduled 定时任务器:是定时任务器:是 Spring3.0 Spring3.0 以后自带的一个定时任务器以后自带的一个定时任务器编写定时任务类,使用component组件交给spring容器管理,可以直接注入service层调用业务逻辑。通过scheduled注解实现任务调度方法。在启动类中开启定时任务的使用,使用EnableScheduling设置定时任频率:fixDelay:固定频率,以上一次任务结束时间开始计算间隔时间。单位毫秒 fixRate:固定频率,以上次开始时间开始计算间隔时间,如果上一次任务执行时间超过间隔时间,则累
28、计任务的执行次数,等上一次任务执行完成之后,继续执行下一次的任务。单位毫秒cron:按条件表达式周期重复执行。4.6 Spring Boot定时任务Scheduled cron 表达式讲解1.cron 表达式是一个字符串,分为 6 或 7 个域,每一个域代表一个含义(秒 分 小时 月份中的日期 月份 星期中的日期 年份)2.cron 有如下两种语法格式:uSeconds Minutes Hours Day Month Week YearuSeconds Minutes Hours Day Month Week3.cron 表达式的时间字段除允许设置数值外,还可使用一些特殊的字符,提供列表、范围
29、通配符等功能,细说如下:u星号(*):可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”;u问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于占位符;u减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从 10 到 12 点,即 10,11,12;u逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五。4.6 Spring Boot定时任务整合 Quartz Quartz 介绍Quartz 组成Job-任务 Trigger-触发器 Scheduler-任务调度Quar
30、tz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 2.3.0。4.7 Spring Boot logback日志记录器 Spring Boot推荐使用logback日志记录器,是对slf4j的扩展,在性能上要比log4j好,配置方式采用xml文件的格式,比log4j的properties更丰富。在spring boot web启动器默认引入了logback jar包。使用上只需要拷贝logback.xml到src/main/resource下完成设置即可。在需要日志记录的类中还是通过slf4j的LoggerFactory获取logger对象。完整示例源码谢 谢 观 赏