在Spring Boot中,使用路径扫描的方式整合内嵌式Servlet容器的Servlet、Filter、Listener三大组件时,首先需要在自定义组件上分别添加@WebServlet、@WebFilter和@WebListener注解进行声明,并配置相关注解属性,然后在项目主程序启动类上使用@ServletComponentScan注解开启组件扫描即可。
一、创建Spring Boot项目 - IntegrateThreeComponents02
二、使用路径扫描方式整合Servlet三大组件
(一)创建MyServlet类
- 通过注解@WebServlet("/hello")给MyServlet定义了urlPattern
(二)创建CodeServlet类
(三)创建MyFilter类
- 通过注解@WebFilter(value = {"/hello", "/code"})让MyFilter过滤两个指定的请求。
(四)创建MyListener类
通过注解@WebListener("/")监听一切请求。
(五)修改入口类,添加ServletComponentScan注解
(六)启动应用,测试效果
启动应用后查看控制台输出
访问
http://localhost:8080/hello
访问
http://localhost:8080/code
可以看到,跟上一讲的项目,运行结果完全一致。
三、路径扫描整合Servlet三大组件小结
使用注解方式,可以省配置文件(比如ServletConfig、FilterConfig和ListenerConfig),大大简化了操作,实际应用时尽量采用此方式来整合Servlet三大组件。
学习目标
掌握利用Spring Boot实现文件上传功能
四、文件上传概述
开发Web应用时,文件上传是很常见的一个需求,浏览器通过表单形式将文件以流的形式传递给服务器,服务器对上传的数据解析处理,Spring Boot中进行文件上传与Spring MVC框架上传类似。
五、实现文件上传功能
(一)创建Spring Boot项目
创建FileUploadDemo项目,添加Web和Thymeleaf依赖
(二)整合Bootstrap
将第11讲项目SpringMvcDemo2021的resources/static里的bootstrap-4.0.0拷贝到当前项目相应位置。
(三)编写文件上传页面
在templates目录里创建文件上传页面 - fileupload.html
表单method必须使用post
表单enctype必须是multipart/form-data
(四)编写项目配置文件
注意配置文件上传文件大小不是M做单位,而是Byte
50M = 50 * 1024 * 1024 B= 52428800 B
300M = 300 * 1024 * 1024 B = 314572800 B
(五)编写文件上传控制器
(六)启动应用,测试效果
访问
http://localhost:8080/uploadFile
查看上传成功的文件
修改文件上传控制器的uploadFile方法的代码
六、控制上传文件类型
可通过上传文件的contentType(String contentType = file.getContentType();)来判断,符合要求的文件则写入磁盘,否则反馈错误信息。
文件超过指定大小也可以在控制器中进行判断,然后给前台反馈友好的提示。
前台也可以先用js做初步判断后再提交表单。
学习目标
- 熟悉Spring Boot的默认缓存管理
- 熟悉Spring Boot的缓存注解及使用
七、缓存概述
(一)引入缓存管理的重要性
缓存是分布式系统中的重要组件,主要解决数据库数据的高并发访问。在实际开发中,尤其是用户访问量较大的网站,用户对高频热点数据的访问非常频繁,为了提高服务器访问性能、减少数据库的压力、提高用户体验,使用缓存显得尤为重要,Spring Boot针对这种实际需求,对缓存提供了良好的支持。
(二)Spring Boot的缓存管理
Spring框架支持透明地向应用程序添加缓存对缓存进行管理,其管理缓存的核心是将缓存应用于操作数据的方法,从而减少操作数据的执行次数,同时不会对程序本身造成任何干扰。Spring Boot继承了Spring框架的缓存管理功能,通过使用@EnableCaching注解开启基于注解的缓存支持,Spring Boot可以启动缓存管理的自动化配置。
八、Spring Boot默认缓存
(一)数据准备
(二)创建Spring Boot项目 - DefaultCacheDemo
(三)创建数据库表对应的实体类
1、创建评论实体类 - Comment
2、创建文章实体类 - Article
(四)创建Repository接口
1、创建评论仓库接口 - CommentRepository
2、创建文章仓库接口 - ArticleRepository
(五)编写Service类
1、创建CommentService类
2、创建ArticleService类
(六)编写控制器
1、编写评论控制器 - CommentController
2、编写文章控制器 - ArticleController
(七)配置全局属性文件
(八)启动应用,测试效果
1、测试查询
查询编号为1的评论记录
访问
http://localhost:8080/find/1
2、测试更新
修改编号1的评论记录,内容改为“十分有趣,值得一读”,作者改为“无心剑”
访问
http://localhost:8080/update?id=1&comment=十分有趣,值得一读&author=无心剑&aId=1
再次查询编号为1的评论记录
看,是不是评论的内容和作者都已经修改成功了?
3、测试删除
删除编号为1的评论
访问
http://localhost:8080/delete/1
再次查询编号为1的评论记录
查看评论表 - t_comment
(九)课后拓展练习
完成ArticleService,ArticleController类并进行测试 - 查询、更新、删除
更新时如果给定的参数值中有中文,写入数据库是乱码,查询资料,解决乱码问题
(十)测试未启用缓存的效果
访问
http://localhost:8080/find/2,查看刷新页面效果
说明:页面每刷新一次,控制台会输出一次SQL语句,即每查询一次,就会访问一次数据库,大大增加了数据库的负担。
(十一)开启默认缓存
1、在入口类上加注释@EnableCaching
该注解一般使用在类上,通常使用在入口 类上
2、在服务类需要启用缓存的方法上加注解@Cacheable
@Cacheable注解既可用在方法上,也可用在类上
(十二)测试启用默认缓存后的效果
启动应用,访问
http://localhost:8080/find/2,并刷新页面查看效果
说明:第一次访问页面时控制台会有SQL语句输出,往后刷新时则不会继续输出SQL语句,即不再连接数据库取数据,而是从缓存中取数据。
九、Spring Boot默认缓存小结
(一)使用缓存的作用
缓存一般用在查询方法上,可以减轻数据库服务器的压力。
(二)常用注解
1、@EnableCaching注解
该注解一般使用在Spring Boot项目的入口类上,开启项目的缓存功能
2、@Cachable注解
- @Cacheable注解也是由Spring框架提供的,可以作用于类或方法(通常用在数据查询方法上),用于对方法结果进行缓存存储。
- @Cacheable注解的执行顺序是,先进行缓存查询,如果为空则进行方法查询,并将结果进行缓存;如果缓存中有数据,不进行方法查询,而是直接使用缓存数据。
- @Cacheable可以指定三个属性,value、key和condition。
(1)value属性
value属性是必须指定的,其表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。其可以是一个Cache也可以是多个Cache。
(2)key属性
key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。
(3)condition属性
- 有的时候我们可能并不希望缓存一个方法所有的返回结果。通过condition属性可以实现这一功能。condition属性默认为空,表示将缓存所有的调用情形。其值是通过SpringEL表达式来指定的,当为true时表示进行缓存处理;当为false时表示不进行缓存处理,即每次调用该方法时该方法都会执行一次。
- 案例演示:只有当comment的id为偶数时才会进行缓存。
3、@CachePut注解
- 在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。
- @CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
- @CachePut也可以标注在类上和方法上。使用@CachePut时我们可以指定的属性跟@Cacheable是一样的。
4、@CacheEvict注解
@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。
其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。
下面我们来介绍一下新出现的两个属性allEntries和beforeInvocation。
(1)allEntries属性
allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。
(2)beforeInvocation属性
清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。
学习目标
- 了解Spring Boot支持的缓存组件
- 掌握基于注解的Redis缓存实现
- 掌握基于API的Redis缓存实现
十、Spring Boot支持的缓存组件
Spring Boot内部嵌入了支持的一系列缓存管理组件,并按照顺序查找加载有效的缓存组件进行缓存管理,如果没有任何缓存组件,会默认使用最后一个Simple默认缓存管理组件进行管理。在实际开发中,通常会使用专业的第三方缓存插件进行缓存管理。
如果开启了缓存,Spring Boot会按照以下顺序去查找缓存组件:
- Generic
- JCache (JSR-107) (EhCache 3、Hazelcast、Infinispan等)
- EhCache 2.x
- Hazelcast
- Infinispan
- Couchbase
- Redis
- Caffeine
- Simple(默认)
十一、基于注解的Redis缓存实现
(一)安装与启动Redis
(二)创建Spring Boot项目 - RedisCacheDemo01
设置组标识、项目标识、包名
添加Spring Web、Spring Data JPA、MySQL Driver、Spring Data Redis依赖
设置项目名及保存位置
查看pom.xml文件
(三)创建评论实体类 - Comment
要实现缓存,实体类必须要实现序列化接口Serializable
(四)创建评论仓库接口 - CommentRepository
自定义方法添加注解@Modifying实现数据更新操作
(五)创建评论服务类 - CommentService
(六)创建评论控制器 - CommentController
(七)配置系统属性文件 - application.properties
(八)在入口类添加注解@EnableCaching开启缓存
(九)Redis可视化工具连接Redis服务
在命令行窗口,启动Redis服务
启动Redis可视化管理工具
(十)启动应用,测试效果
1、测试各个方法的观察点
- 浏览器返回值
- 控制台输出数据
- Redis数据数据变化
- MySQL数据库数据变化
2、基于注解的Redis查询缓存测试
MySQL数据库评论表原始数据
Redis数据库原始数据
访问
http://localhost:8080/find/1
查看控制台输出的SQL语句
查看Redis数据库缓存的数据
此时,刷新页面,控制台不会输出SQL语句,也就是说不再查询数据库,直接使用Redis缓存数据
3、基于注解的Redis更新缓存测试
查看控制台输出的SQL语句
查看Redis数据库缓存的数据
查看MySQL数据库中的评论表
4、基于注解的Redis删除缓存测试
访问
http://localhost:8080/delete/1
查看控制台输出的SQL语句
查看查看Redis数据库,缓存的数据已被删除
查看MySQL数据库中的评论表,id为1的评论已被删除
目录
一、创建Spring Boot项目 - IntegrateThreeComponents02