33、在SpringBoot项目添加Web组件(Servlet、Filter 和 Listener) 的三种方法

news2025/1/21 1:00:47

通过Spring Bean 来添加 Servlet、Filter 和 Listener

★ 添加Web组件(Servlet、Filter、Listener)的三种方式:

 - 使用Spring Bean添加Servlet、Filter或Listener。

 - 使用XxxRegistrationBean手动添加Servlet、Filter或Listener。

 - 使用ClassPath扫描添加Servlet、Filter和Listener。

★ 第一种方式:使用Spring Bean添加Servlet、Filter或Listener

——只要将这些Web组件配置成容器中Bean即可。
Spring Boot会自动将这些特殊的bean注册成Web组件。

 通过这种方式添加的Servlet、Filter或Listener,由于它们都是Spring容器中的Bean,非常方便地利用Spring的依赖注入。

 因此可以可以方便地访问application.properties中配置的属性值,
 也可利用依赖注入将Spring容器中的其他Bean注入这些Servlet、Filter或Listener。

 当Spring容器中只有一个Servlet时,它默认被映射到应用的根路径(/);
 当Spring容器中有包含多个Servlet时,它们的映射地址就是它们的Bean名称(name属性值),别忘了后面必须带一个斜杠结尾。

 而Filter的映射地址则默认为/*。

浏览器访问这些bean的注意点:

对这些bean进行访问,由于把Servlet、Filter 和 Listener 配置成了spring容器中的bean,所以没有办法为它们指定映射地址,所以springboot就会给默认给它们一个映射地址。

当Spring容器中只有一个Servlet时,它默认被映射到应用的根路径(/);
当Spring容器中有包含多个Servlet时,它们的映射地址就是它们的Bean名称(name属性值),而且访问的时候,bean的名称的首字母要小写,别忘了后面必须带一个斜杠结尾(为什么加斜杠?因为springboot就是这么规定的)。
也可以在注解上这么显式指定名称,在Component注解显式指定为first,那么这个FirstServlet的Bean的id或者是name属性(就是类名)就变成了 first,访问的时候就不再是firstServlet而是first
在这里插入图片描述

代码演示:

先创建servlet、filter 和 listener 这三个bean。

1、创建两个 servlet ,后面用来演示 访问路径的注意点
用 @Component 修饰,这个类将成为spring容器中的一个bean,springboot会自动将它注册为 Servlet bean
在这里插入图片描述

创建 Filter 过滤器
用 @Component 修饰,这个类将成为spring容器中的一个bean,springboot会自动将它注册为 Filter 过滤器bean

在这里插入图片描述

创建 Listener 监听器
用 @Component 修饰,这个类将成为spring容器中的一个bean,springboot会自动将它注册为 Listener 监听器bean
在这里插入图片描述

测试:
启动项目,走了 filter 过滤器 和 listener 监听器 这个两个bean的一些方法
在这里插入图片描述

访问 servlet ,走了过滤器的 doFilter 过滤方法
在这里插入图片描述

关闭项目,走过滤器和监听器的方法。
在这里插入图片描述

总结:从启动项目,访问 servlet 这个bean ,到关闭项目,过滤器和监听器的方法都有执行到。

启动项目:Filter 过滤器的 init 初始化方法,Listener 监听器的 contextInitialized web应用初始化时被触发的方法。

访问 servlet 这个bean:执行 Servlet bean的代码设置,如 writer 方法输出字符串到浏览器页面,也走了过滤器的 doFilter 过滤方法

关闭项目:执行了 Filter 过滤器的 destroy 销毁方法,执行了 Listener 监听器的 contextDestroyed web应用销毁时被触发的方法

★ 第二种方式:使用XxxRegistrationBean来注册Servlet、Filter或Listener

在容器中配置XxxRegistrationBean可注册Web组件,每个注册Bean注册一个Web组件
 - ServletRegistrationBean 注册 Servlet。
 - FilterRegistrationBean 注册 Filter。
 - ServletListenerRegistrationBean 注册 Listener.

通过这种方式注册时,开发者可获得对Web组件全部的控制权,
它们也不是Spring容器中的Bean,因此不会自动接收依赖注入。


【备注】:虽然通过这种方式来注册Web组件时,它们不能自动接受Spring容器的依赖注入
          但由于这种方式可以获得Web组件的全部控制权,因此可以现在配置类中使用依赖注入,然后将被注入的值传递给web组件,
          因此这些Web组件同样可以获取Spring Boot应用的配置属性。

代码演示:

因为第一种方法使用的是把Servlet、Filter、Listener 通过 @Component 修饰成spring容器中的bean,添加这个注解spring容器就会把这三个注册成组件。

现在是要使用XxxRegistrationBean来注册Servlet、Filter或Listener,所以还用上面的三个类,只是不用 @Component 来修饰成组件。把原本的 @Component 注解去掉,让它们三个变成普通类。

然后创建一个配置类,在配置类里面通过 XxxRegistrationBean 将 Servlet、Filter、Listener 一个一个配置bean,来对它们进行注册。
在这里插入图片描述

测试:在配置类里面通过 XxxRegistrationBean 注册 Servlet、Filter、Listener 的这些组件都生效。
在这里插入图片描述

注意:如果该类不是spring容器中的bean,那么该类就没法使用依赖注入,不会生效。如图
在这里插入图片描述
在这里插入图片描述

FirstServlet 这个类把原本的 message 依赖注入直接改成普通的成员变量,然后给一个set方法
然后再 配置类里面,因为配置类是spring容器中的一个bean,所以能进行依赖注入,可以拿到yml配置中的 message 属性值,然后把值set 给 firstServlet 这个实例对象就可以了。
在这里插入图片描述

★ 第三中方式:使用Classpath扫描的方式来注册Web组件:

这种方式很方便,只要两步:
(1)为Web组件添加@WebServlet、@WebFilter或@WebListener注解。
(2)使用@ServletComponentScan注解告诉Spring Boot去扫描、注册Web组件。
这些注解不属于spring,也不属于springboot,属于java web 规范的,所以默认springboot是不识别的,需要再通过@ServletComponentScan注解告诉Spring Boot去扫描、注册Web组件。

通过这种方式添加的Web组件依然是Spring容器中的Bean,因此它们同样可接受依赖注入。而且用起来很方便,可以为它们指定映射地址。

因此推荐使用这种方式
【注意:】 由于Listener的启动时机非常早,因此Listener在监听到Web应用时,没有获取依赖注入的值。

代码演示:

把三个类拷贝到另一个包里面来进行第三种方法的注册web组件
因为用这些注解后,也是把这三个注册到spring容器中的bean,所以也能进行依赖注入。
在这里插入图片描述

测试: 注册 Servlet、Filter、Listener 的这些组件都生效。
依赖注入也有效果,因为它们都是spring容器中的bean

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/925423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Cloud Alibaba-Sentinel--服务容错

1 高并发带来的问题 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络 原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题,调用这个服务就会出…

kafka--技术文档--架构体系

架构体系 Kafka的架构体系包括以下几个部分: Producer. 消息生产者,就是向Kafka broker发送消息的客户端。Broker. 一台Kafka服务器就是一个Broker。一个集群由多个Broker组成。一个Broker可以容纳多个Topic。Topic. 可以理解为一个队列,一…

从零开始的Hadoop学习(二)| Hadoop介绍、优势、组成、HDFS架构

1. Hadoop 是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。主要解决,海量数据的存储和海量数据的分析计算问题。广义上来说,Hadoop通常是指一个更广泛的概念—Hadoop生态圈。 2. Hadoop 的优势 高可靠性:Hadoop底层维护多…

js reverse实现数据的倒序

2023.8.25今天我学习了如何在数组顺序进行倒序排列,如: 原数组为: 我们只需要对数组使用reverse()方法 let demo [{id: 1, name: 一号},{id: 2, name: 二号},{id: 3, name: 三号},]demo.reverse()console.log(demo) 扩展: 当我…

SV-9032 机架式网络采播器

SV-9032 机架式网络采播器 一、描述 18123651365微信 SV-9032是我司的一款机架式网络采播器,具有10/100M以太网接口,后面板上有两路线路输入接口,可以直接连接音源输出设备,将采集音源编码后发送至网络播放终端上。同时还具有三…

Python Scrapy网络爬虫框架从入门到实战

Python Scrapy是一个强大的网络爬虫框架,它提供了丰富的功能和灵活的扩展性,使得爬取网页数据变得简单高效。本文将介绍Scrapy框架的基本概念、用法和实际案例,帮助你快速上手和应用Scrapy进行数据抓取。 Scrapy是一个基于Python的开源网络爬…

淘宝免费爬虫数据 商品详情数据 商品销售额销量API

场景:一个宽敞明亮的办公室,一位公司高管坐在办公桌前。 高管(自言自语):淘宝,这个平台上商品真是琳琅满目,应该有不少销售数据吧。我该怎么利用这些数据呢? 突然,房间…

vue 后台管理系统登录 记住密码 功能(Cookies实现)

安装插件 import Cookies from js-cookie 组件引入 import Cookies from js-cookie; 存值: Cookies.set(username, state.account, { expires: 30 }); // username 存的值的名字,state.account 存的值 expires 存储的时间,30天Cookies…

Android开发之性能优化工具Profiler

前言 性能优化问题,在我们开发时都会遇到,但是在小厂和对自己要求不严格的情况下,我都很少去做性能优化; 在性能优化上,基本大家都是通过自己的开发经验和性能分析工具来发现问题,今天给大家分享一下小编最…

学习中ChatGPT的17种用法

ChatGPT本质上是一个聊天工具,旧金山的人工智能企业OpenAI于2022年11月正式推出ChatGPT。那么,ChatGPT与其他人工智能产品相比有什么特殊呢? 它除了可以回答结构性的问题,例如语法修正、翻译和查找答案之外。最关键的是它能够去解…

CSDN编程题-每日一练(2023-08-25)

CSDN编程题-每日一练(2023-08-25) 一、题目名称:影分身二、题目名称:小鱼的航程(改进版)三、题目名称:排查网络故障 一、题目名称:影分身 时间限制:1000ms内存限制:256M 题目描述&am…

cadence virtuoso标准库不见了

问题描述,启动virtuoso后发现标准库(如analogLib、basic、ahdLib)不见了 解决办法: 在启动路径下找到cds.lib文件输入下图代码(注意将/opt/cadence/IC617换成自己的cadence安装路径) 保存cds.lib文件后&a…

Spring Boot简介

文章目录 一、引言1.1 初始化配置1.2 整合第三方框架1.3 后期维护1.4 部署工程1.5 敏捷式开发 二、SpringBoot介绍三、SpringBoot快速入门【重点】3.1 快速构建SpringBoot3.1.1 选择构建项目的类型3.1.2 项目的描述3.1.3 指定SpringBoot版本和需要的依赖3.1.4 导入依赖3.1.5 编…

突破电商单一垂直赛道:Chewy宠物用品如何飙升至美国市场50%以上

《美国商业资讯》2023年5月31日报道,宠物品牌Chewy的最新市值为 143 亿美元,毛利率同比增长90个基点,在美国的宠物电商市场,实现超过50%的市场占有率。 Chewy是一个涵盖各类宠物用品与宠物医疗的新兴品牌,后疫情时代迎…

spring之Spring测试与集成

Spring测试与集成 摘要引言词汇解释详细介绍单元测试和集成测试单元测试和集成测试编写单元测试和集成测试代码单元测试示例集成测试示例 Spring Test和JUnit简介编写使用Spring Test和JUnit的测试代码UserService示例单元测试示例 使用Spring Test和JUnit 注意事项总结参考资料…

数据结构基础:P3-树(上)----编程作业02:List Leaves

本系列文章为浙江大学陈越、何钦铭数据结构学习笔记,系列文章链接如下: 数据结构(陈越、何钦铭)学习笔记 文章目录 一、题目描述二、整体思路与实现代码 一、题目描述 题目描述: 给定一棵树,按照从上到下、从左到右的顺序列出所有…

c语言练习题26:调整数组使奇数位于偶数前面

调整数组使奇数位于偶数前面 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; #include<stdio.h> #include<string.h> void func(int* arr, int len) {int left 0;int right len - 1;while (left < right) {while (left < right && arr[lef…

1427205-93-3|Fmoc-Ser(Ac4Manα1-2Ac3Manα1-2Ac3Manα)-OH是指糖类与氨基酸通过糖苷键连接而成的化合物

糖基化氨基酸是指糖类与氨基酸通过糖苷键连接而成的化合物。这种糖苷键的形成是由于糖类的末端羟基与氨基酸的氨基之间发生脱水缩合反应糖。基化氨基酸具有多种生物学功能&#xff0c;如作为酶、激素和抗体的成分&#xff0c;参与细胞识别和信息传递等。 在生物体内&#xff0c…

resultType和parametertype的区别

文章目录 1. resultType&#xff1a;2. parameterType&#xff1a;3. 总结看这里就够啦&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;举例 1. resultType&#xff1a; 返回值类型&#xff0c;类型即为对象类型&#xff0c;返回结果字段与对象属性…

视频云存储/安防监控视频智能分析网关V3:占道经营功能详解

违规占道经营者经常会在人流量大、车辆集中的道路两旁摆摊&#xff0c;导致公路交通堵塞&#xff0c;给居民出行的造成不便&#xff0c;而且违规占路密集的地方都是交通事故频频发生的区域。 TSINGSEE青犀视频云存储/安防监控视频/AI智能分析网关V3运用视频AI智能分析技术&…