过滤器使用与bean注入

2023-11-05

1 web.xml中各元素启动顺序

在项目启动时,监听器listener最先初始化,然后是过滤器filter,最后是servlet。
Spring监听器在启动时会读取spring配置文件,进行spring容器的初始化。springMVC的dispatcherServlet初始化时会读取springMVC的配置文件,进行springMVC容器的初始化。Spring容器初始化时会实例化各个bean。(个人认为web容器初始化时其中的各元素是按上述顺序依次初始化的,其他元素全部初始化完成之后web容器才初始化完成。但目前没有看到过一个十分确切的说法,等以后有时间研究一下源码)。

2 过滤器的使用

网上很多资料说在过滤器中拿不到spring注入的bean,原因是过滤器初始化时spring容器还没初始化好,其实并不是。下面看一段代码:
在web.xml中定义过滤器:

<filter>
  <filter-name>demoFilter</filter-name>  
  <filter-class>xx.framework.filter.demoFilter</filter-class>
</filter>
<filter-mapping>  
<filter-name>demoFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

然后在过滤器的初始化方法init中:

@Override
public void init(FilterConfig filterConfig) throws ServletException {
    ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(filterConfig.getServletContext());
    RedisTemplate demoBean = (RedisTemplate)context.getBean("redisTemplate");
    System.out.println(demoBean);
 }

经过测试,此时是可以拿到spring中的redisTemplate 这个bean的,说明spring容器确实先于过滤器初始化的。那么回到过滤器中不能注入bean的问题,原因究竟是什么呢?可以看到,这里获取bean是通过applicationContext获取的,而不是直接注入的。个人理解是:过滤器是servlet规范中定义的,并不归spring容器管理,也无法直接注入spring中的bean(会报错)。当然,要想通过spring注入的方式来使用过滤器也是有办法的,先在web.xml中定义:

<filter>
  <filter-name>DelegatingFilterProxy</filter-name> 
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  <init-param>
    <param-name>targetBeanName</param-name>
    <param-value>demoFilter</param-value>
  </init-param>
  <init-param>
    <param-name>targetFilterLifecycle</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>DelegatingFilterProxy</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

然后在spring容器中配置demoFilter这个bean:

<bean id="demoFilter" class="xx.framework.filter.demoFilter" />

在doFilter方法中可以获取到注入的bean了:

@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
   System.out.println(redisTemplate.getClientList());
}

其中redisTemplate是通过@Resource注解注入进来的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

过滤器使用与bean注入 的相关文章

  • Vue+Element-ui+SpringBoot搭建后端汽车租赁管理系统

    最近在做项目 花了一周的时间搭建了一个十分完备的汽车租赁后端管理系统 页面采用纯Vue2 Element ui搭建 后端采用Springboot Mybatis搭建 数据库采用Mysql 包括了登录验证 根据不同权限进入不同界面 数据增删改
  • SpringBoot基础(1)

    目录 SpringBoot基础 1 SpringBoot基础 2 SpringBoot基础 3 1 hello world 相当简单 pom xml文件中配置
  • Spring IOC 容器:掌握 Spring 的核心技术

    Spring 是一个非常流行和强大的 Java 开发框架 它可以帮助我们简化和优化 Java 项目的开发过程 Spring 的核心技术之一就是 IOC Inversion of Control 控制反转 它可以实现对象之间的解耦 让对象的创
  • @Value值注入及配置文件组件扫描方式

    spring配置文件对应的是父容器 springMVC配置文件产生的是子容器 前者一般配置数据源 事务 注解等 当然还可以进一步将一些配置细化到其他xml中 后者一般配置控制层相关的 如静态资源 视图解析器等 系统启动的时候 先初始化父容器
  • Spring Bean的管理(IOC 依赖注入)

    文章目录 Spring Bean 基于xml的实现 name定义别名的演示 scope作用域的演示 singleton 演示 prototype 演示 xml配置方式的依赖注入 创建对象 为对象中的值赋值 方式一 通过构造方式的注入属性值
  • FactoryBean和BeanFactory:Spring IOC容器的两个重要角色简介

    目录 一 简介 二 BeanFactory 三 FactoryBean 四 区别 五 使用场景 总结 一 简介 在Spring框架中 IOC Inversion of Control 容器是一个核心组件 它负责管理和配置Java对象及其依赖
  • Mybatis对数据库数据的查询

    简单类型的映射 返回的是简单基本类型 接口中的定义 int getAdminCount 返回数据库总共还几条数据 xml中具体的实现
  • 过滤器使用与bean注入

    1 web xml中各元素启动顺序 在项目启动时 监听器listener最先初始化 然后是过滤器filter 最后是servlet Spring监听器在启动时会读取spring配置文件 进行spring容器的初始化 springMVC的di
  • eggjs&sequelize使用教程一(环境搭建)

    前言 原来想写express sequelize的 但是公司现在放弃了express 转战eggjs 所以这个的教程就以egg为基础 安装egg 官方有完整的教程 需要安装的模块 package js zengwe zengwe PC eg
  • mybatis5-分页插件.md

    一 jar包 逆向工程不支持分页 PageHelper 底层使用拦截器 二 配置拦截器
  • Spring Boot:让你轻松掌握自动装配的奥秘

    Spring Boot是基于Spring框架开发的一种应用框架 它通过自动装配机制 大大简化了Spring应用的开发和部署 使开发者可以更加专注于业务逻辑的实现 而无需过多关注Bean的实例化和装配过程 本文将从以下几个方面介绍Spring
  • Dubbo 、 OpenFegin 远程服务调用的使用区别

    Dubbo 与 OpenFegin 都利用于远程调用层面 其中包括协议 负载均衡等都有不同的点 并且在使用上面也有不同的形式 简约记录一下两者的用法 1 服务端 dubbo 1 添加dubbo依赖 2 服务类添加 DubboService
  • gRpc指南

    本文翻译自官网 原文 https grpc io docs languages java quickstart 快速开始 下面通过一个简单的样例 让你快速上手基于java的gRpc的使用 前置条件 JDK7以上版本 获取示例代码 示例代码是
  • Spring中的JDBC模块

    文章目录 什么是Spring JDBC Spring JDBC的开发步骤 下载 Spring JdbcTemplate 的jar包 导入属性文件 管理数据源对象 在配置文件中创建JdbcTemplate对象 JdbcTemplate 中常用
  • shardingsphere引发 java.lang.String cannot be cast to java.lang.Integer异常

    错误描述 mysql数据库查询sql在数据库连接工具中可以正常运行 在加入了shardingsphere的jar包的项目中抛如下异常 java lang ClassCastException java lang String cannot
  • SpringBoot注解详解:从核心到Web,从数据到测试,一网打尽

    总结的了平时学习springboot常用的一些注解 方便以后开发时可以阅览回忆 springboot的常用注解可以分为以下几类 核心注解 这些注解是springboot的基础 用于启动 配置和管理springboot应用 Web MVC注解
  • Spring AOP:面向切面编程的简介和实践

    目录 一 什么是AOP 二 AOP的核心概念 三 Spring AOP的实现方式 第一种 注解配置AOP 第二种 xml配置AOP 一 什么是AOP AOP Aspect Oriented Programming 即面向切面编程 是一种编程
  • SpringBoot-yml配置文件的使用与优势

    目录 一 什么是yml配置文件 二 如何在SpringBoot中使用yml配置文件 三 如何在SpringBoot中注入yml配置文件的属性 Value注解 ConfigurationProperties注解 四 yml配置文件与prope
  • Spring Boot中如何编写优雅的单元测试

    单元测试是指对软件中的最小可测试单元进行检查和验证 在Java中 单元测试的最小单元是类 通过编写针对类或方法的小段代码 来检验被测代码是否符合预期结果或行为 执行单元测试可以帮助开发者验证代码是否正确实现了功能需求 以及是否能够适应应用环
  • Mybatis对数据的增删改查

    文章目录 创建sql的映射文件 增加 插入数据 修改 删除 查找 向数据库参数传递 简单参数 多个参数 传入对象 使用map传递 Mybatis的基本增删改查总的代码演示 创建sql的映射文件

随机推荐

  • 计算机硬件acc作用,累加器A的主要作用是什么_一文解析累加器a和acc的区别

    累加器简介 在中央处理器中 累加器 accumulator 是一种寄存器 用来储存计算产生的中间结果 如果没有像累加器这样的寄存器 那么在每次计算 加法 乘法 移位等等 后就必须要把结果写回到内存 也许马上就得读回来 然而存取主存的速度是比
  • 【微信小程序】微信小程序支付、微信小程序webview引入H5实现支付等

    最近有个需要由于H5页面需要嵌套在微信小程序里面 所以H5的支付在小程序里面就行不通了 不过我看社区里面说的测试环境微信小程序webview引入H5是可以实现调取H5支付功能的 线上则调不起来 时间紧迫 咱也不敢尝试啊 只能另辟蹊径了 哈哈
  • vs2013+qt5.9.5+vsaddin安装配置

    一 下载地址 Qt下载地址 https mirrors tuna tsinghua edu cn qt archive qt 5 9 5 9 5 qt opensource windows x86 5 9 5 exehttps mirror
  • 【安全开发】C/C++安全编码规范

    C本质上是不安全的编程语言 例如如果不谨慎使用的话 其大多数标准的字符串库函数有可能被用来进行缓冲区攻击或者格式字符串攻击 但是 由于其灵活性 快速和相对容易掌握 它是一个广泛使用的编程语言 下面是针对开发安全的C语言程序的一些规范 1 1
  • windows11百度网盘下载,win11iso镜像百度云下载

    windows11百度网盘下载 win11iso镜像百度云 windows11百度网盘下载 win11iso镜像百度云链接 https pan baidu com s 1r96WDwsDURdrRt1nl Z0PQ 提取码 6666 上面是
  • 在vant组件下阻止手机自带键盘弹起

    废话 van field输入框伴随着小键盘的弹起 但是在已经定义了的van popup中 小键盘的弹起显得多余 尤其在地区 籍贯等的选择上 所以利用 focus 在获取焦点的时候进行阻止 代码
  • 局域网配置网站DNS服务器的安装

    小提示 要想成功部署DNS服务 运行Windows Serve 2003的计算机中必须拥有一个静态IP地址 只有这样才能让DNS客户端定位DNS服务器 另外如果希望该DNS服务器能够解析Internet上的域名 还需保证该DNS服务器能正常
  • STM32单片机示例:多个定时器级联使用

    文章目录 目的 基础说明 关键配置与代码 示例链接 目的 有些情况下会遇到单片机的定时器位数不够用 这时候可以使用低定时器级联的方式来处理 这里将对此做个示例说明 基础说明 这里说的定时器级联是指一个定时器正常计数工作 然后在发生溢出时发送
  • PYthon 转换HTML到Text纯文本

    今天项目需要将HTML转换为纯文本 去网上搜了一下 发现Python果然是神通广大 无所不能 方法是五花八门 拿今天亲自试的两个方法举例 以方便后人 方法一 1 安装nltk 可以去pipy装 注 需要依赖以下包 numpy PyYAML
  • AT24C02的使用说明和完整代码-51单片机

    AT24C02的使用说明和完整代码 51单片机 简述 at24c02为存储器芯片 可以使用单片机将数据存入其中 同时也可以任意读取 at24c02的原理及使用方法在其说明资料中已有充分的讲述 本篇仅对其使用的关键步骤进行罗列 以及说明一下具
  • MySQL主从复制的实现

    MySQL主从复制的理解图 MySQL Replication原理 主从复制 也称 AB 复制 允许将来自一个MySQL数据库服务器 主服务器 的数据复制到一个或多个MySQL数据库服务器 从服务器 复制是异步的 从站不需要永久连接以接收来
  • React中文文档之Lifting State Up

    Lifting State Up 提升状态 经常的 几个组件需要映射相同的数据改变 我们推荐提升共享的state状态到它们最近的公共祖先元素 让我们看看这是如何实现的 在这个章节 我们将创建一个温度计算器 计算在一个给定的温度 水是否会沸腾
  • 20200331 --【Python】-- selenium 登录练习

    学习 python 的第59天 模拟腾讯课堂 自动化 登录案例 简单 coding utf 8 Time 2020 3 31 10 52 Author admin Site File 腾讯课堂登录 py Software PyCharm i
  • Allegro显示飞线和隐藏飞线

    隐藏飞线 显示飞线
  • C++ 标准库中数据类型转换

    头文件引用
  • 延迟队列的方案设计

    延迟队列的实现方案 一 应用场景 什么是延时队列 顾名思义 首先它要具有队列的特性 再给它附加一个延迟消费队列消息的功能 也就是说可以指定队列中的消息在哪个时间点被消费 延时队列在项目中的应用场景是比较多的 尤其像电商类平台 1 订单成功后
  • 基于js利用经纬度进行两地的距离计算

    根据地球上两点之间的经纬度计算两点之间的直线距离 经纬度到距离的计算在通信工程中应用比较广泛 所以cosbeta通过搜索找到了一个js的计算脚本 其实是google map的计算脚本 应该算是比较准确了 做成了这个经纬度算距离的工具 今天有
  • 全到哭,阿里新产2023版Java架构核心宝典,涵盖Java进阶所有主流技术

    导言 什么是架构师 对于程序员来说 聊架构是一个永不过时的话题 实际上 每一家公司都有自己对架构师不同的定位 因为不同的公司 所处的阶段 业务模式以及应用场景都不一样 因此对架构师的要求不一样 所以定位也就不同 但是 无论如何 架构师除了优
  • STM32------TFTLCD原理

    目录 TFTLCD简介 一 知识点 1 TFTLCD驱动原理 ALINETEK TFTLCD模块介绍 2 2 8寸TFLCD模块特点 3 TFTLCD模块原理图 4 TFTLCD接口说明 5 并口驱动简介 6 ILI9341驱动时序 7 驱
  • 过滤器使用与bean注入

    1 web xml中各元素启动顺序 在项目启动时 监听器listener最先初始化 然后是过滤器filter 最后是servlet Spring监听器在启动时会读取spring配置文件 进行spring容器的初始化 springMVC的di