关于Spring中管理Bean的杂谈

文章讨论了Spring框架中Bean的管理原则,强调filter和监听器通常由Web容器而非Spring直接管理。对于EasyExcel的自定义监听器,虽然不能直接注入SpringBean,但提供了通过自定义工具类或Hutool获取Spring容器对象的解决方案。
摘要由CSDN通过智能技术生成

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对象.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值