注入Servlet、Filter、Listener的两种方式

news2024/11/17 0:32:13

文章目录

  • 注入Servlet、Filter、Listener
    • 官方文档
    • 基本介绍
    • 应用实例1-使用注解方式注入
      • 需求:
      • 应用实例-实现
      • 注意:
    • 应用实例2-使用RegistrationBean 方式注入
      • 需求:
      • 应用实例-实现
    • 注意事项和细节说明
      • 原因分析
        • 说明
      • 源码分析

注入Servlet、Filter、Listener

官方文档

文档:
https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.developing-web-applications.embedded-container.servlets-filters-listeners

基本介绍

  1. 考虑到实际开发业务非常复杂和兼容,Spring-Boot 支持将Servlet、Filter、Listener 注入Spring 容器, 成为Spring bean。
  2. 也就是说明Spring-Boot 开放了和原生WEB 组件(Servlet、Filter、Listener)的兼容。

应用实例1-使用注解方式注入

需求:

演示通过注解方式注入Servlet、Filter、Listener

应用实例-实现

1.创建com/nlc/usersys/servlet/Servlet_.java

/**
 * 解读
 * 1. 通过继承 HttpServlet 来开发原生的Servlet
 * 2. @WebServlet 标识将 Servlet_ 对象/bean注入到容器
 * 3. (urlPatterns = {"/servlet01","/servlet02"} ,是映射路径,对servlet配置了url-pattern
 * 4. 提示: 注入的原生的Servlet_ 不会被spring-boot的拦截器拦截
 * 5. 对于开发的原生的Servlet ,需要使用 @ServletComponentScan指定要扫描的原生Servlet包, 才会注入到spring 容器.
 */
@WebServlet(urlPatterns = {"/servlet01","/servlet02"})//映射两个路径
public class Servlet_ extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 	{
        resp.getWriter().write("hello,Servlet_!");
    }
}
  1. 修改com/nlc/usersys/Application.java , 加入@ServletComponentScan
//要求扫描com.nlc.springboot 包/子包下的原生方式注入的Servlet
@ServletComponentScan(basePackages = "com.nlc.springboot")
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext ioc =
                SpringApplication.run(Application.class, args);
        System.out.println("hello");
    }
}
  1. 完成测试, 浏览器http://localhost:8080/servlet01

image-20230818154132148

  1. 创建com/nlc/usersys/servlet/Filter_.java
/**
 * 开发Filter 并注入
 * 解读
 * 1. @WebFilter 表示Filter_是一个过滤器,并注入容器
 * 2. urlPatterns = {"/css/*", "/images/*"} 当请求  /css/目录资源或者 /images/目录下资源的时候,会经过该过滤器
 * 3. 这里是直接放行后,在经过拦截器, 拦截器是否拦截要根据拦截器的拦截规则
 * 4. 过滤器配置的urlPatterns 也会经过Spring-Boot 拦截器
 */
@Slf4j
@WebFilter(urlPatterns = {"/css/*", "/images/*"})
public class Filter_ implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("--Filter_ init--");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("--Filter_ doFilter--");
        //为了方便观察过滤器处理的资源,我们输出一个uri
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        log.info("过滤器处理的uri={}", httpServletRequest.getRequestURI());
        //我们直接放行-实际开发中,根据自己的业务来决定如何处理
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        log.info("--Filter_ destroy--");
    }
}
  1. 创建static/css/t.css, 作为测试文件

image-20230818154757801

  1. 完成测试, 注意观察后台, 浏览器输入: http://localhost:8080/css/t.css

image-20230818154951645

  1. 创建com/nlc/usersys/servlet/Listener_.java
@Slf4j
@WebListener
//@WebListener 表示Listener_是web监听器,并注入容器
public class Listener_ implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {

        //这里可以加入项目初始化的相关业务代码
        log.info("Listener_ contextInitialized 项目初始化OK~");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        //这里可以加入相应代码...
        log.info("Listener_ contextDestroyed 项目销毁");
    }
}
  1. 完成测试, 启动项目,观察后台输出

image-20230818161433443

注意:

过滤器配置的urlPatterns 也会经过Spring-Boot 拦截器(根据拦截器的规则),所以为了看到效果,请在拦截器配置放行/css/ **
在servlet 匹配全部是/*, 在Spring-Boot 是/**

image-20230818160954820

应用实例2-使用RegistrationBean 方式注入

需求:

演示使用RegistrationBean 注入Servlet、Filter、Listener

应用实例-实现

  1. 创建com/nlc/usersys/config/RegisterConfig_.java
/**
 * RegisterConfig_: 是一个配置类
 * proxyBeanMethods = true : 默认是单例返回bean[保证每个@Bean 方法被调用多少次返回的组件都是 单实例的, 是代理方式]
 */
@Configuration(proxyBeanMethods = true)
public class RegisterConfig_ {

    //以使用RegistrationBean方式注入
    //注入Servlet
    @Bean
    public ServletRegistrationBean servlet_() {
        //创建原生的Servlet对象
        Servlet_ servlet_ = new Servlet_();
        //把servlet_对象关联到 ServletRegistrationBean 对象
        //"/servlet01", "/servlet02" 就是注入的Servlet的url-pattern
        return new ServletRegistrationBean(servlet_, "/servlet01", "/servlet02");
    }

    //注入filter
    @Bean
    public FilterRegistrationBean filter_() {
        Filter_ filter_ = new Filter_();//创建原生的filter
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(filter_);
        //设置filter的url-pattern
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/css/*", "/images/*"));
        return filterRegistrationBean;
    }
    //注入Listener
    @Bean
    public ServletListenerRegistrationBean listener_() {
        //创建原生的Listener对象
        Listener_ listener_ = new Listener_();
        return new ServletListenerRegistrationBean(listener_);
    }
}
  1. 去掉相关的注解,再次完成测试

image-20230818162143796

image-20230818162207047

image-20230818162239960

image-20230818162946588

注意事项和细节说明

请求Servlet 时,不会到达DispatherServlet, 因此也不会达到拦截器

原因分析

​ 1.注入的Servlet 存在Spring 容器中

​ 2.DispatherServlet 也存在Spring 容器

image-20230818164239223

说明

1.多个Servlet都能处理到同一层路径,精确优先原则/最长前缀匹配原则。

2.使用当/servlet01时,就会直接匹配到注入的servlet。

3.Tomcat 对Servlet url 匹配的原则, 多个servlet 都能处理到同一层路径, 精确优先原则/最长前缀匹配原则.

4.spring 容器的debug 图.

image-20230818165130914

image-20230818165158330

  1. 在SpringBoot 中, 去调用@Controller 目标方法是按照DispatherServlet 分发匹配的机制。

源码分析

  1. DispatcherServletAutoConfiguration 完成对DispatcherServlet 自动配置
  2. 下面执行流程分析

image-20230819181637978

image-20230819181722753
image-20230819181827155

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

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

相关文章

高效mac常用快捷键整理

高效mac常用快捷键整理 macOS全局、剪切、拷贝、粘贴finder 和 系统快捷键文稿 浏览器chrome标签页和窗口快捷键功能快捷键网页快捷键 Idea & Pycharm必记编辑查询&替换导航重构编译、运行、调试 iTerm标签分屏编辑 文本编辑 sublime text导航:打开&关闭…

高级艺术二维码制作教程

最近不少关于二维码制作的,而且都是付费。大概就是一个好看的二维码,扫描后跳转网址。本篇文章使用Python来实现,这么简单花啥钱呢?学会,拿去卖便宜点吧。 文章目录 高级二维码制作环境安装普通二维码艺术二维码动态 …

2023国赛数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模式树算法&#xff0c…

让Linux融入生活! 家用服务器折腾指南《树莓派不吃灰》系列文章更新满20篇!

title: 让Linux融入生活! 家用服务器折腾指南《树莓派不吃灰》系列文章更新满20篇! 截止2023年8月19日,《树莓派防吃灰》(也可以叫《树莓派不吃灰》,怎么好念怎么来)系列,已经更新了20篇。这是一份基于Ubu…

LeetCode[面试题04.12]求和路径

难度:Medium 题目: 给定一棵二叉树,其中每个节点都含有一个整数数值(该值或正或负)。设计一个算法,打印节点数值总和等于某个给定值的所有路径的数量。注意,路径不一定非得从二叉树的根节点或叶节点开始或结束&#x…

第六章在web中应用MyBatis

准备 MyBatis内部可以帮我们生成dao接口的实现类(代理类,dao接口的代理) 使用这种代理机制的前提是,SqlMapper.xml文件中的namespace必须是dao接口的全限定名称,id必须是dao接口的方法名 开始 创建一个SpringBoot项…

jdk 1.8新特性 01内部类和lambda

01.内部类: 1、成员内部类 内部类与成员外部类的关系 a.成员内部类的创建需要依赖于外部类对象-(成员方法必须通过对象调用),在没有外部类实例之前无法创建成员内部类对象 b.内部类与外部类相对独立,不是is a 的关系…

vs2022配置opencv进行监控 c++

下载opencv文件 下载好的目录结构是 以上就是用到的文件和目录 在vs2022配置 最后:此处运行提示找不到 opencv_world480.dll 解决办法:直接从 复制到windows下

Android 场景Scene的使用

Scene 翻译过来是场景,开发者提供起始布局和结束布局,就可以实现布局之间的过渡动画。 具体可参考 使用过渡为布局变化添加动画效果 大白话,在 Activity 的各个页面之间切换,会带有过渡动画。 打个比方,使用起来类似…

回归预测 | MATLAB实现FA-SVM萤火虫算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现FA-SVM萤火虫算法优化支持向量机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现FA-SVM萤火虫算法优化支持向量机多输入单输出回归预测(多指标,多图)效果一览基本介绍…

《Zookeeper》源码分析(十五)之 选举算法

FastLeaderElection FastLeaderElection实现了接口Election,选举方法为lookForLeader(),选举算法的核心逻辑也在该方法中。 数据结构 构造函数 start() 启动选举通信网络 lookForLeader() 选举核心算法 FastLeaderElection.logicalclock属性用于标…

2023最新红盟云卡个人自动发卡系统源码 全开源

​ 简介: 2023最新红盟云卡个人自动发卡系统源码 全开源 该系统完全开源且无任何加密,可商业使用,并支持个人免签多个接口。 ​ 图片:

2021年03月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;找和为K的两个元素 在一个长度为n(n < 1000)的整数序列中&#xff0c;判断是否存在某两个元素之和为k。 时间限制&#xff1a;1000 内存限制&#xff1a;65536 输入 第一行输入序列的长度n和k&#xff0c;用空格分开。 第二行输入序列中的n个整数&#xff…

Redis 扩展资料

Redis 扩展资料 1.缓存简介2.缓存分类3.常⻅缓存使⽤4.Redis 数据类型和使⽤5.持久化6.常⻅⾯试题7.Redis 集群&#xff08;选学&#xff09; 1.缓存简介 2.缓存分类 3.常⻅缓存使⽤ 4.Redis 数据类型和使⽤ 5.持久化 Redis 和 Memcached 有什么区别&#xff1f; 6.常⻅⾯试…

独立站SEO是什么意思?自主网站SEO的含义?

什么是独立站SEO优化&#xff1f;自建站搜索引擎优化是指什么&#xff1f; 独立站SEO&#xff0c;作为网络营销的重要一环&#xff0c;正在逐渐引起人们的关注。在当今数字化时代&#xff0c;独立站已经成为许多企业、个人宣传推广的首选平台之一。那么&#xff0c;究竟什么是…

【计算机视觉|生成对抗】StackGAN:使用堆叠生成对抗网络进行文本到照片逼真图像合成

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks 链接&#xff1a;[1612.03242] StackGAN: Text to Photo-realistic Image Synthesis…

article-六轴机械臂(带抓手)运动学分析+轨迹规划

1正运动学分析 采用标准的D-h法进行机械腿模型分析&#xff1a; D-h表如下 &#xff08;2&#xff09;通过&#xff08;1&#xff09;求解出机器人各位姿变换矩阵后&#xff0c;求解机器人手臂变换矩阵 ** ** 。通过matlab 计算&#xff0c;写出机器人末端位置。 正运动学分…

爬虫框架- feapder + 爬虫管理系统 - feaplat 的学习简记

文章目录 feapder 的使用feaplat 爬虫管理系统部署 feapder 的使用 feapder是一款上手简单&#xff0c;功能强大的Python爬虫框架 feapder 官方文档 文档写的很详细&#xff0c;可以直接上手。 基本命令&#xff1a; 创建爬虫项目 feapder create -p first-project创建爬虫 …

【ES5和ES6】数组遍历的各种方法集合

一、ES5的方法 1.for循环 let arr [1, 2, 3] for (let i 0; i < arr.length; i) {console.log(arr[i]) } // 1 // 2 // 32.forEach() 特点&#xff1a; 没有返回值&#xff0c;只是针对每个元素调用func三个参数&#xff1a;item, index, arr &#xff1b;当前项&#…

D2: 基于go实现的一个DSL 绘图工具 高手效率神器

在b站看视频的时候, gin框架作作者appleboy 一直在推荐一个绘图工具 大佬认证 肯定有其过人之处 我去各网站收集(chao)了一些关于D2的东西 D2 是一种声明式流程图的领域特定语言 (DSL)&#xff0c;声明式只需要描述你想要的流程图即可&#xff0c;它就会自动生成对应的图像。…