Spring-Boot技术培训(1).pptx
《Spring-Boot技术培训(1).pptx》由会员分享,可在线阅读,更多相关《Spring-Boot技术培训(1).pptx(41页珍藏版)》请在冰豆网上搜索。
SpringBoot技术分享,2019.3.15,目录,第一部分:
SpringBoot入门,1.1SpringBoot简介,1.2SpringBoot的优点,在没有使用SpringBoot时构建项目时什么样的?
在项目中存在大量的xml文件,配置相当繁琐整合第三方框架时的配置jar包问题低效的开发效率与部署效率问题SpringBoot解决了什么?
使配置简单使编码简单使部署简单,1.3SpringBoot快速构建项目,打开SpringBoot的官网https:
/spring.io/projects/spring-boot构建SpringBoot的页面https:
/start.spring.io/通过SpringBoot官方提供的启动器支持web全栈开发,提供了40+种启动器,jar包集中管理,解决jar包版本和依赖冲突问题。
1.4SpringBoot入门HelloWorld,新增一个controller,通过requestMapping注解映射url,新增启动类:
通过SpringBootApplication注解标识。
可以和controller位于同一个包下,或者位于controller的上一级包中。
运行启动类:
将应用程序打包,并自动部署到tomcat容器中。
在浏览器输入地址访问即可。
第二部分:
SpringBoot初级应用,2.1SpringBoot项目目录结构,2.2SpringBoot核心注解,2.3SpringBoot配置文件,properties配置文件:
key=value的格式。
key之间是以“.”进行分割yml配置文件:
是SpringBoot中新增的一种配置文件格,以树状结构展示。
key之间使用“:
”进行分割缩进一定不能使用tab键,否则会报错。
value和key中间的分号后面必须有一个空格,3.多环境配置文件语法结构:
application-profile.yml,profile:
代表的就是一个环境变量application-dev.yml开发环境application-test.yml测试环境application-prod.yml生产环境,按环境加载配置文件运行项目控制台运行项目java-jarxxx.jar-spring.profiles.active=profile新增一个全局配置文件application.yml文件,打包的时候通过active指定变量。
2.4SpringBoot视图层技术,整合jsp;整合freemarker;整合thymeleaf:
spring官方推荐的视图层技术,通过特定语法对html的标记做渲染。
springboot要求所有的静态资源都放在src/main/resources/static目录下。
要求模板形式的视图层技术的文件必须要放到src/main/resources/templates,该目录是安全的,目录下的内容是不允许外界直接访问的。
2.4SpringBoot视图层技术-Thymeleaf,变量输出与字符串操作,th:
text在页面中输出值th:
value可以将一个值放入到input标签的value中Thymeleaf内置对象调用内置对象一定要用#大部分的内置对象都以s结尾strings、numbers、dates$#strings.isEmpty(key)判断字符串是否为空,如果为空返回true,否则返回false$#strings.contains(msg,T)判断字符串是否包含指定的子串,如果包含返回true,否则返回false$#strings.startsWith(msg,a),2.4SpringBoot视图层技术-Thymeleaf,变量输出与字符串操作,$#strings.startsWith(msg,a)判断当前字符串是否以子串开头,如果是返回true,否则返回false$#strings.endsWith(msg,a)判断当前字符串是否以子串结尾,如果是返回true,否则返回false$#strings.length(msg)返回字符串的长度$#strings.indexOf(msg,h)查找子串的位置,并返回该子串的下标,如果没找到则返回-1$#strings.substring(msg,13)$#strings.substring(msg,13,15)截取子串,用法与jdkString类下SubString方法相同$#strings.toUpperCase(msg)$#strings.toLowerCase(msg)字符串转大小写。
2.4SpringBoot视图层技术-Thymeleaf,日期格式化处理,$#dates.format(key)格式化日期,默认的以浏览器默认语言为格式化标准$#dates.format(key,yyy/MM/dd)按照自定义的格式做日期转换获取年、月、日$#dates.year(key)$#dates.month(key)$#dates.day(key)year:
取年Month:
取月Day:
取日,2.4SpringBoot视图层技术-Thymeleaf,条件判断,th:
if性别:
男性别:
女th:
switchID为1ID为2ID为3,2.4SpringBoot视图层技术-Thymeleaf,迭代遍历,th:
each迭代listTh:
each迭代map,2.4SpringBoot视图层技术-Thymeleaf,域对象操作,HttpServletRequestrequest.setAttribute(req,HttpServletRequest);Request:
HttpSessionrequest.getSession().setAttribute(sess,HttpSession);Session:
ServletContextrequest.getSession().getServletContext().setAttribute(app,Application);Application:
2.4SpringBoot视图层技术-Thymeleaf,URL表达式,标签:
th:
href和th:
src基本语法:
URL类型绝对路径绝对路径相对路径:
相对于项目的上下文的相对路径:
相对路径相对于服务器路径的根:
相对于服务器的根在url中实现参数传递相对路径传参在url中通过restful风格进行参数传递相对路径传参-restful,第三部分:
SpringBoot整合持久层,3.1SpringBoot项目工程搭建,3.2MyBatis逆向工程生成pojo和mapper文件,3.3MVC应用实现增删改查,导入项目启动,浏览器输入:
http:
/localhost:
8081/add,第四部分:
SpringBoot高级应用,4.1SpringBoot数据校验,SpringBoot对表单数据校验的技术特点,使用了Hibernate-validate校验框架。
在Controller中开启对实体对象的校验,用valid注解;通过BindingResult接受校验结果。
在pojo属性上增加相应的注解,举例:
NotNull限制必须不为null。
NotEmpty:
元素不为null且不为空(字符串长度不为0、集合大小不为0)。
NotBlank(message=“xxx不能为空):
判断字符串是否为null或者是空串(去掉首尾空格)。
Length(min=6,max=10,message=最小长度为6位,最大长度为10位):
判断字符的长度(最大或者最小)Min:
判断数值最小值Max:
判断数值最大值Email:
判断邮箱是否合法,4.2SpringBoot全局事务,在编辑用户方法上声明事务Transactional,调用mapper接口修改方法后,抛出异常,数据回滚未修改成功。
反之如果没有声明事务,即使抛出异常,修改数据也不会回滚。
SpringAOP即声明式事务管理默认是针对uncheckedexception回滚,RuntimeException及其子类和错误(Error);checked异常,即在编译期间就会检查必须捕获处理的不会回滚,如果想针对checked异常进行事务回滚,可以在注解里使用rollbackFor属性明确指定异常回滚类型。
SpringBoot开启申明式事务,只需要一个Transactional就可以。
因为在SpringBoot中已经默认对jpa和mybatis,hibernate开启了事务,在引入引用的时候自动就开启了事务。
4.2SpringBoot全局事务,常见隐藏bug,业务层捕捉异常后,发现事务不生效。
在业务层手工捕捉并处理了异常,异常被吃掉了,Spring不知道出现错误,所以不会回滚。
推荐异常处理方法,在业务层统一抛出异常,然后在控制层统一处理。
使用springboot全局异常处理机制。
4.2SpringBoot全局事务,常用属性,4.2SpringBoot全局事务,事务传播行为:
所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。
在TransactionDefinition定义中包括了如下几个表示传播行为的常量:
PROPAGATION_REQUIRED:
如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
这是默认值。
PROPAGATION_REQUIRES_NEW:
创建一个新的事务,如果当前存在事务,则把当前事务挂起。
PROPAGATION_SUPPORTS:
如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
PROPAGATION_NOT_SUPPORTED:
以非事务方式运行,如果当前存在事务,则把当前事务挂起。
PROPAGATION_NEVER:
以非事务方式运行,如果当前存在事务,则抛出异常。
PROPAGATION_MANDATORY:
如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
PROPAGATION_NESTED:
如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED。
4.2SpringBoot全局事务,声明全局事务,通过配置类注解Configuration+Bean完成Spring全局事务声明,后续事务就不需要在每个业务层的方法上通过注解开启事务。
统一管理,简化代码。
创建一个通知bean:
定义声明事务的具体逻辑。
创建一个建议者bean:
包括切面和逻辑。
定义切面并设置切点pointcut,引用通知bean作为事务逻辑。
4.3SpringBoot异常处理,自定义错误页面:
默认的处理异常的机制,一旦程序中出现了异常会像/error的url发送请求。
默认BasicExceptionController来处理/error请求,然后跳转到默认显示异常的页面,可以自定义error.html页面。
ExceptionHandler注解:
在Controller内部创建方法处理异常。
该方法需要返回一个ModelAndView,目的是封装异常信息以及视图的指定。
ControllerAdvice+ExceptionHandler注解:
创建一个能够处理异常的全局异常类。
在该类上需要添加ControllerAdvice注解。
SpringBoot中对于异常处理提供了五种处理方式,4.3SpringBoot异常处理,配置SimpleMappingExceptionResolver处理异常:
在全局异常类中添加一个方法完成异常的统一处理,缺点不能将详细的异常信息显示到页面。
该方法返回值类型必须是SimpleMappingExceptionResolver。
自定义HandlerExceptionResolver类处理异常:
通过实现HandlerExceptionResolver接口做全局异常处理。
4.4SpringBoot整合junit单元测试,添加junit环境的jar包SpringBoot测试类注解:
RunWith(SpringJUnit4ClassRunner.class):
启动器,让junit与spring环境进行整合SpringBootTest(classes=App.class):
当前类为springboot的测试类,加载SpringBoot启动类。
4.5SpringBoot热部署,自动重启原理在于springboot使用两个classloader:
不改变的类(如第三方jar)由base类加载器加载,正在开发的类由restart类加载器加载。
应用重启时,restart类加载器被扔掉重建,而base类加载器不变,这种方法意味着应用程序重新启动通常比“冷启动”快得多,因为base类加载器已经可用并已填充。
自动重启设置当我们开启devtools后,classpath中的文件变化会导致应用自动重启。
Eclipse中保存文件即可引起classpath更新(注:
),从而触发重启。
IDEA则需要自己手动CTRL+F9重新编译一下。
排除静态资源需要打开自动编译静态资源文件在改变之后有时候没必要触发应用程序重启,例如thymeleaf模板文件就可以实时编辑,/templates下的资源不会触发重启,而是触发livereload(重新加载)。
4.5SpringBoot热部署,默认情况下,更改/META-INF/maven,/META-INF/resources,/resources,/static,/public或默认设置spring.devtools.restart.exclude=static/*,public/*如果需要保留默认配置,同时增加新的配置,则可配置spring.devtools.restart.additional-exclude=templates/*观察额外的路径不在classpath中的路径的文件变化并触发重启,则可以配置spring.devtools.restart.additional-paths=xxx。
LiveReloadDevTools内置了一个LiveReload服务,可以在资源变化时用来触发浏览器刷新。
当然这个需要你浏览器安装了LiveReload插件,并且启动这个插件才行。
4.6SpringBoot定时任务Scheduled,4.6SpringBoot定时任务Scheduled,cron表达式讲解cron表达式是一个字符串,分为6或7个域,每一个域代表一个含义(秒分小时月份中的日期月份星期中的日期年份)cron有如下两种语法格式:
SecondsMinutesHoursDayMonthWeekYearSecondsMinutesHoursDayMonthWeekcron表达式的时间字段除允许设置数值外,还可使用一些特殊的字符,提供列表、范围、通配符等功能,细说如下:
星号(*):
可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”;问号(?
):
该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于占位符;减号(-):
表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12;逗号(,):
表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五。
4.6SpringBoot定时任务整合Quartz,Quartz是OpenSymphony开源组织在Jobscheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。
Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。
Jobs可以做成标准的Java组件或EJBs。
Quartz的最新版本为Quartz2.3.0。
4.7SpringBootlogback日志记录器,完整示例源码,谢谢观赏,