Spring Boot 使用路径扫描方式整合Servlet三大组件

在Spring Boot中,使用路径扫描的方式整合内嵌式Servlet容器的Servlet、Filter、Listener三大组件时,首先需要在自定义组件上分别添加@WebServlet、@WebFilter和@WebListener注解进行声明,并配置相关注解属性,然后在项目主程序启动类上使用@ServletComponentScan注解开启组件扫描即可。

一、创建Spring Boot项目 - IntegrateThreeComponents02

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

二、使用路径扫描方式整合Servlet三大组件

(一)创建MyServlet类

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

  • 通过注解@WebServlet("/hello")给MyServlet定义了urlPattern

(二)创建CodeServlet类

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(三)创建MyFilter类

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

  • 通过注解@WebFilter(value = {"/hello", "/code"})让MyFilter过滤两个指定的请求。

(四)创建MyListener类

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

通过注解@WebListener("/")监听一切请求。

(五)修改入口类,添加ServletComponentScan注解

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(六)启动应用,测试效果

启动应用后查看控制台输出

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

访问
http://localhost:8080/hello

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

访问
http://localhost:8080/code

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

可以看到,跟上一讲的项目,运行结果完全一致。

三、路径扫描整合Servlet三大组件小结

使用注解方式,可以省配置文件(比如ServletConfig、FilterConfig和ListenerConfig),大大简化了操作,实际应用时尽量采用此方式来整合Servlet三大组件。

学习目标

掌握利用Spring Boot实现文件上传功能

四、文件上传概述

开发Web应用时,文件上传是很常见的一个需求,浏览器通过表单形式将文件以流的形式传递给服务器,服务器对上传的数据解析处理,Spring Boot中进行文件上传与Spring MVC框架上传类似。

五、实现文件上传功能

(一)创建Spring Boot项目

创建FileUploadDemo项目,添加Web和Thymeleaf依赖

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(二)整合Bootstrap

将第11讲项目SpringMvcDemo2021的resources/static里的bootstrap-4.0.0拷贝到当前项目相应位置。

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(三)编写文件上传页面

在templates目录里创建文件上传页面 - fileupload.html

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

表单method必须使用post

表单enctype必须是multipart/form-data

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(四)编写项目配置文件

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

注意配置文件上传文件大小不是M做单位,而是Byte

50M = 50 * 1024 * 1024 B= 52428800 B

300M = 300 * 1024 * 1024 B = 314572800 B

(五)编写文件上传控制器

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(六)启动应用,测试效果

访问
http://localhost:8080/uploadFile

查看上传成功的文件

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

修改文件上传控制器的uploadFile方法的代码

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

六、控制上传文件类型

可通过上传文件的contentType(String contentType = file.getContentType();)来判断,符合要求的文件则写入磁盘,否则反馈错误信息。

文件超过指定大小也可以在控制器中进行判断,然后给前台反馈友好的提示。

前台也可以先用js做初步判断后再提交表单。

学习目标

  1. 熟悉Spring Boot的默认缓存管理
  2. 熟悉Spring Boot的缓存注解及使用

七、缓存概述

(一)引入缓存管理的重要性

缓存是分布式系统中的重要组件,主要解决数据库数据的高并发访问。在实际开发中,尤其是用户访问量较大的网站,用户对高频热点数据的访问非常频繁,为了提高服务器访问性能、减少数据库的压力、提高用户体验,使用缓存显得尤为重要,Spring Boot针对这种实际需求,对缓存提供了良好的支持。

(二)Spring Boot的缓存管理

Spring框架支持透明地向应用程序添加缓存对缓存进行管理,其管理缓存的核心是将缓存应用于操作数据的方法,从而减少操作数据的执行次数,同时不会对程序本身造成任何干扰。Spring Boot继承了Spring框架的缓存管理功能,通过使用@EnableCaching注解开启基于注解的缓存支持,Spring Boot可以启动缓存管理的自动化配置。

八、Spring Boot默认缓存

(一)数据准备

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(二)创建Spring Boot项目 - DefaultCacheDemo

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(三)创建数据库表对应的实体类

1、创建评论实体类 - Comment

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

2、创建文章实体类 - Article

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(四)创建Repository接口

1、创建评论仓库接口 - CommentRepository

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

2、创建文章仓库接口 - ArticleRepository

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(五)编写Service类

1、创建CommentService类

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

2、创建ArticleService类

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(六)编写控制器

1、编写评论控制器 - CommentController

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

2、编写文章控制器 - ArticleController

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(七)配置全局属性文件

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(八)启动应用,测试效果

1、测试查询

查询编号为1的评论记录

访问
http://localhost:8080/find/1

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

2、测试更新

修改编号1的评论记录,内容改为“十分有趣,值得一读”,作者改为“无心剑”

访问 
http://localhost:8080/update?id=1&comment=十分有趣,值得一读&author=无心剑&aId=1

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

再次查询编号为1的评论记录

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

看,是不是评论的内容和作者都已经修改成功了?

3、测试删除

删除编号为1的评论

访问
http://localhost:8080/delete/1

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

再次查询编号为1的评论记录

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

查看评论表 - t_comment

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(九)课后拓展练习

完成ArticleService,ArticleController类并进行测试 - 查询、更新、删除

更新时如果给定的参数值中有中文,写入数据库是乱码,查询资料,解决乱码问题

(十)测试未启用缓存的效果

访问
http://localhost:8080/find/2,查看刷新页面效果

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

说明:页面每刷新一次,控制台会输出一次SQL语句,即每查询一次,就会访问一次数据库,大大增加了数据库的负担。

(十一)开启默认缓存

1、在入口类上加注释@EnableCaching

该注解一般使用在类上,通常使用在入口 类上

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

2、在服务类需要启用缓存的方法上加注解@Cacheable

@Cacheable注解既可用在方法上,也可用在类上

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(十二)测试启用默认缓存后的效果

启动应用,访问
http://localhost:8080/find/2,并刷新页面查看效果

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

说明:第一次访问页面时控制台会有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为偶数时才会进行缓存。

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

3、@CachePut注解

  • 在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。
  • @CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
  • @CachePut也可以标注在类上和方法上。使用@CachePut时我们可以指定的属性跟@Cacheable是一样的。

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

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一下清除所有的元素,这比一个一个清除元素更有效率。

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(2)beforeInvocation属性

清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

学习目标

  1. 了解Spring Boot支持的缓存组件
  2. 掌握基于注解的Redis缓存实现
  3. 掌握基于API的Redis缓存实现

十、Spring Boot支持的缓存组件

Spring Boot内部嵌入了支持的一系列缓存管理组件,并按照顺序查找加载有效的缓存组件进行缓存管理,如果没有任何缓存组件,会默认使用最后一个Simple默认缓存管理组件进行管理。在实际开发中,通常会使用专业的第三方缓存插件进行缓存管理。

如果开启了缓存,Spring Boot会按照以下顺序去查找缓存组件:

  1. Generic
  2. JCache (JSR-107) (EhCache 3、Hazelcast、Infinispan等)
  3. EhCache 2.x
  4. Hazelcast
  5. Infinispan
  6. Couchbase
  7. Redis
  8. Caffeine
  9. Simple(默认)

十一、基于注解的Redis缓存实现

(一)安装与启动Redis

(二)创建Spring Boot项目 - RedisCacheDemo01

设置组标识、项目标识、包名

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

添加Spring Web、Spring Data JPA、MySQL Driver、Spring Data Redis依赖

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

设置项目名及保存位置

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

查看pom.xml文件

(三)创建评论实体类 - Comment

要实现缓存,实体类必须要实现序列化接口Serializable

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(四)创建评论仓库接口 - CommentRepository

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

自定义方法添加注解@Modifying实现数据更新操作

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(五)创建评论服务类 - CommentService

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(六)创建评论控制器 - CommentController

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(七)配置系统属性文件 - application.properties

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(八)在入口类添加注解@EnableCaching开启缓存

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(九)Redis可视化工具连接Redis服务

在命令行窗口,启动Redis服务

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

启动Redis可视化管理工具

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

(十)启动应用,测试效果

1、测试各个方法的观察点

  • 浏览器返回值
  • 控制台输出数据
  • Redis数据数据变化
  • MySQL数据库数据变化

2、基于注解的Redis查询缓存测试

MySQL数据库评论表原始数据

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

Redis数据库原始数据

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

访问
http://localhost:8080/find/1

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

查看控制台输出的SQL语句

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

查看Redis数据库缓存的数据

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

此时,刷新页面,控制台不会输出SQL语句,也就是说不再查询数据库,直接使用Redis缓存数据

3、基于注解的Redis更新缓存测试

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

查看控制台输出的SQL语句

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

查看Redis数据库缓存的数据

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

查看MySQL数据库中的评论表

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

4、基于注解的Redis删除缓存测试

访问
http://localhost:8080/delete/1

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

查看控制台输出的SQL语句

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

查看查看Redis数据库,缓存的数据已被删除

阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

查看MySQL数据库中的评论表,id为1的评论已被删除

目录

一、创建Spring Boot项目 - IntegrateThreeComponents02

二、使用路径扫描方式整合Servlet三大组件

三、路径扫描整合Servlet三大组件小结

四、文件上传概述

五、实现文件上传功能

六、控制上传文件类型

七、缓存概述

八、Spring Boot默认缓存

九、Spring Boot默认缓存小结

十、Spring Boot支持的缓存组件

十一、基于注解的Redis缓存实现


阿里内部热捧的SpringBoot全栈笔记,源码实战齐飞,火速收藏

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值