代码编织梦想

1 filter、监听器,不能直接被spring容器管理

1 spring更多的是管理我们自己的各种组件,filter之类的是交给web容器来管的,我们不会自己去调用filter.

2 filter、监听器是生存在web容器里的,Spring MVC容器也是存活在web容器里的,他们是平级关系,怎么能由Spring管理呢, 但filter、监听器是可以取到Spring容器的.

3 因为Spring用的是DispatcherSevlet,是在Filter之后执行的。

2 Listener监听器不能被Spring管理

​ 在使用EasyExcel中的读取excel时,需要使用到监听器,但是在Listener监听器中无法使用Spring容器的@Resource或者@Autowired 注解的方法注入bean,因为,在web Server容器中,无论是Servlet,Filter,还是Listener都不是Spring容器管理的,因此我们都无法在这些类中直接使用Spring注解的方式来注入我们需要的对象。Servlet的整个生命周期都是由Servlet容器来处理的。如果把它硬放到Spring容器中去创建,Servlet对象是可被Spring容器建出来,但Servlet容器可能根本就不知道这个Servlet是否存在,因为不在它自己的容器中。所以,servlet交给web server来管理,不要交给spring管理。

3 使用EasyExcel的自定义监听器,可使用Spring容器

​ 在监听器里面完成插入等操作,插入操作是通过mybatisPlus的条件构造器完成的,需要注入自定义的SubjectService来完成,但是直接在监听器里使用@Auwowired注入subjectService,会报空指针。
原因如下:
首先要区分Listener的生命周期和spring管理的bean的生命周期。
(1)Listener的生命周期是由servlet容器(例如tomcat)管理的,项目启动时ExcelListener是由servlet容器实例化并调用其contextInitialized方法,而servlet容器并不认得@Autowired注解,因此导致SubjectService实例注入失败。
(2)spring容器中的bean的生命周期是由spring容器管理的。
在web Server容器中,无论是Servlet,Filter,还是Listener都不是Spring容器管理的,因此我们在这些类中不能直接使用Spring注解的方式来注入我们需要的对象.

解决办法:

​ 1 可通过自定义工具类SpringUtil实现ApplicationContextAware接口, 从而在监听器中通过工具类SpringUtil获得Spring容器中的Bean对象.

​ 2 使用hutool工具jar中提供的SpringUtil获取Spring容器Bean对象.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ABestRookie/article/details/136184875

Activiti工作流介绍-1-爱代码爱编程

一 Activiti工作流介绍 1 Activiti 概述 1.1 Activiti Activiti是一个工作流引擎,可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程流activiti进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性

EasyPoi 导入校验使用-爱代码爱编程

EasyPoi 导入校验使用 因工作需要,使用easypoi导入表格,并进行校验,将表格中有问题的地方,给出提示信息,以表格形式返回. 本篇,直接讲述Excel导入校验,基本介绍后续补上. 1 基于Springboot的easypoi导入表格校验 1 pom.xml <!--easypoi与SpringBoot的整

Java操作Excel的相关技术-爱代码爱编程

Java操作Excel的相关技术 1 POI报表概述 1.1 背景说明 java代码操作excel有两种api类库 jxl (只能操作旧版本的excel)poi(新的和旧的excel版本都能操作)常见的应用场景: 为了方便操作,基于Excel的报表批量上传数据通过java代码生成Excel报表导出1.2 Excel的两种形式 目前世面上的Exc

使用cmd命令添加path环境变量-爱代码爱编程

参考地址: https://www.jb51.net/article/193241.htm set命令 (暂时有效) set命令用于设置当前cmd窗口中的环境变量,只在当前cmd窗口有效,cmd窗口关闭后将会失效,而其不会影响到系统中保存的用户环境变量. setx命令(永久有效) 设置永久用户环境变量 setx "env_name" "env_v

Oracle的分页查询-爱代码爱编程

Oracle的分页查询 1 分页查询引入2 Oracle分页查询 1 分页查询引入 关于查询功能, 一次将所有查询结果返回给前台,带来的问题有: 1是查询量较大,查询时间多2是前台的数据展示能力有限.所以一般采用分页查询功能. Mysql数据库: 使用Limit (page, size)关键字做分页查询.Oracle数据库: 因为Orac

SpringBoot项目时区问题-爱代码爱编程

SpringBoot项目时区问题 1 局部配置1 入参对象属性使用JsonFormat注解2 全局配置2 配置一个bean实现整体修改3 通过配置文件设置4 在Application启动类中添加5 在Application启动类方法中添加3 数据库时区问题 最近,博主在工作中遇到奇怪问题, 前端在某些查询功能时,会将时间条件检验并将北京时

关于Spring中RequestBodyAdvice的使用-爱代码爱编程

关于Spring中RequestBodyAdvice的使用 1 关于RequestBodyAdvice概述2 关于RequestBodyAdvice的使用1 准备环境1 准备文件1 application.yml2 实体类3 Controller控制器2 创建一个拦截类,实现RequestBodyAdvice接口3 使用postman工具测试1 p

关于@SneakyThrows使用-爱代码爱编程

关于@SneakyThrows使用 1 异常引入2 @SneakyThrows1 SneakyThrows注解的源码2使用案例 关于@SneakyThrows注解的使用,主要是消除代码中异常处理代码. 1 异常引入 Java中异常Throwable分为两类, 一种是Exception类,称为受检异常(Checked Excepti

关于通用mapper中批量新增的问题说明-爱代码爱编程

关于通用mapper中批量新增的问题说明 1 问题引入1 问题说明2 问题分析1 tk.mybatis.mapper.additional.insert.InsertListMapper2 tk.mybatis.mapper.common.special.InsertListMapper2 问题解决3 通用mapper相关注解说明1 @Table2

关于MySQL中日期的使用-爱代码爱编程

关于MySQL中日期的使用 1 日期等于\大于\小于2 日期增加一个时间段 date_add()3 日期减小一个时间段 date_sub()4 两个日期相差比较5 时间截取6 常见小案例 最近在使用sql函数时,因项目数据库不同,导致sql中日期的使用方法大不相同, 一些常见的日期计算,都有不同的应用,故整理记录一下MySQL的日期用法。 以

关于easyexcel中读取excel表头的说明_easyexcel headrownumber-爱代码爱编程

关于easyExcel中读取Excel表头的说明 1 环境准备2 单表头Excel3 多表头Excel4 总结 在使用easyExcel读取文件时,对于Excel的表头,在解析读取时分成不

关于git中代码代码push出现index. lock问题_git index.lock-爱代码爱编程

关于Git中代码代码push出现index. lock问题 1 问题引入2 问题说明3 解决方法 1 问题引入 在正常使用git进行push代码时,突然失败了, 再次push代码,报如下错误: