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

通过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.mzph.cn/news/51546.shtml

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

相关文章

QT6安装完成后,再安装低版本的MinGW或其他组件方式

首先进入点击安装的uinstall Qt 并不是真的卸载 通过下面几步 1,首先登录自己账户 2,然后进入欢迎中,点击“添加和移除组件” 3,然后检索自己需要的安装内容

Unity实现广告滚动播放、循环播放、鼠标切换的效果

效果: 场景结构: 特殊物体:panel下面用排列组件horizent layout group放置多个需要显示的面板,用mask遮罩好。 using System.Collections; using System.Collections.Generic; using DG.Tweening; using UnityEngine; using Unity…

第4篇:vscode+platformio搭建esp32 arduino开发环境

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 1.配置默认安装路径,安装到D盘。 打开环境变量,点击新建 输入变量名PLATFORMIO_CORE_DIR与路径:D:\PLATF…

linux服务TCP参数配置

Linux TCP参数配置 阿里云规范 1.【推荐】高并发服务器建议调小 TCP 协议的 time_wait 超时时间。 说明:操作系统默认 240 秒后,才会关闭处于 time_wait 状态的连接,在高并发访问下,服务器端会因为处于 time_wait 的连接数太多&am…

idea切换Git分支时保存未提交的文件

解决方案 我们现在有三个分支,如下图: 我们目前在tenant分支上进行开发,需要去修复master的Bug,假设我们在tenant分支上修改了一个文件,如下图: 方法一:使用Shelve Changes 1、选中tenant上你不…

高性能服务器Nodejs操作Mysql数据库

目录 1 Node 操作 mysql1.2 操作 mysql 数据库 2 Web 开发模式2.1 服务端渲染2.2 前后端分离2.3 如何选择 3 身份认证3.1 Session 认证机制3.2 JWT 认证机制 1 Node 操作 mysql 数据库和身份认证 配置 mysql 模块 安装 mysql 模块 npm install mysql建立连接 const mysql …

Android相机-HAL-Rockchip-hal3

引言: 对于Android相机的 HAL层而言对上实现一套Framework的API接口,对下通过V4L2框架实现与kernel的交互。不同的平台会有不同的实现方案。主要是对Android HAL3的接口的实现。看看rockchip是怎么支持hal3的? 代码目录: hardw…

python+tkinter实现多页面多菜单的demo实例

本篇文章主要讲解,python+tkinter多页面多菜单的demo实例,支持一个新窗口弹出、多页面切换,顶部菜单构建及事件绑定。 日期:2023年8月25日 版本:python3.9.6 实际效果 消息菜单-具体效果: 页面菜单具体效果: 事件菜单具体效果: 环境及依赖 python 3.9.6 依赖信息: …

rabbitMq安装后无法启动可视化页面http://localhost:15672处理

本次安装环境信息: 系统:win10 64位专业版 erlang:otp_win64_23.0 rabbitMQ:rabbitmq-server-3.8.5 安装rabbitMQ需要依赖erlang语言环境,所以需要我们下载erlang的环境安装程序。 一、下载安装程序 rabbitMQ安装…

java八股文面试[java基础]——接口和抽象类的区别

知识来源: 【基础】接口和抽象类_哔哩哔哩_bilibili 【2023年面试】Java中抽象类和接口有什么区别_哔哩哔哩_bilibili 【23版面试突击】抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么?_…

上门服务系统|上门服务小程序如何提升生活质量?

上门服务其实就是本地生活服务的升级,上门服务包含很多行业可以做的。例如:厨师上门、上门家电维修、跑腿等等。如今各类本地化生活服务越来越受大家的喜爱。基于此市场愿景,我们来谈谈上门服务系统功能。 一、上门服务系统功能 1、预约服务…

API 网关基础

目录 一、网关概述二、网关提供的功能三、常见网关系统3.1 Netflix Zuul3.2 Spring Cloud Gateway3.3 Kong3.4 APISIX3.5 Shenyu 一、网关概述 API网关是一个服务器,是系统的唯一入口。 从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部…

【SpringCloud技术专题】「Gateway网关系列」(1)微服务网关服务的Gateway组件的原理介绍分析

为什么要有服务网关? 我们都知道在微服务架构中,系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?难道要一个个的去调用吗?很显然这是不太实际的,我们需要有一个统一的接口与这些微服务打交道&#xf…

Streamlit 讲解专栏(十):数据可视化-图表绘制详解(上)

文章目录 1 前言2 st.line_chart:绘制线状图3 st.area_chart:绘制面积图4 st.bar_chart:绘制柱状图5 st.pyplot:绘制自定义图表6 结语 1 前言 在数据可视化的世界中,绘制清晰、易于理解的图表是非常关键的。Streamlit…

HCIP-OpenStack组件之neutron

neutron(ovs、ovn) OVS OVS(Open vSwitch)是虚拟交换机,遵循SDN(Software Defined Network,软件定义网络)架构来管理的。 OVS介绍参考:https://mp.weixin.qq.com/s?__bizMzAwMDQyOTcwOA&mid2247485088&idx1…

【WebSocket】前端使用WebSocket实时通信

目录 前言什么是WebSocketWebSocket的工作原理WebSocket与HTTP的关系HTTP建立持久化连接WebSocket类封装 前言 最近写项目,需要实现消息通知和实时聊天的功能,就去了解了一些关于websocket的知识,总结如下。 什么是WebSocket WebSocket 是一…

开源ChatGPT系统源码 采用NUXT3+Laravel9后端开发 前后端分离版本

开源ChatGPT系统源码 采用NUXT3Laravel9后端开发 前后端分离版本 ChatGPT是一种基于AI的聊天机器人技术,它可以帮助用户与聊天机器人进行自然语言交流,以解决用户的问题或满足用户的需求。ChatGPT的核心技术是使用自然语言处理(NLP&#xff…

什么是Flex布局?请列举一些Flex布局的常用属性。

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Flex布局(Flexible Box Layout)⭐ Flex布局的常用属性⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之…

openCV实战-系列教程7:轮廓检测2与模板匹配(轮廓检测/轮廓特征/轮廓近似/轮廓边界矩阵/轮廓边界圆/模版匹配)、原理解析、源码解读

打印一个图片可以做出一个函数: def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() 1、轮廓特征与近似 1.1 轮廓特征 前面我们计算了这个图片的轮廓: 它的轮廓信息保存在了contours中,取出第一个轮廓&…

vue element-ui 菜单管理使用图标选择器组件

目录 🌟前言🌟安装🌟main.js配置🌟页面使用🌟效果展示 🌟前言 哈喽小伙伴们,本文为大家介绍一下 VueElementUI 中图标选择器组件的使用方法;一起来看下吧。 🌟安装 np…