关于Filter无法注入bean问题的解决方案

        最近在项目开发过程中,需要写一个过滤器,来校验第三方应用的用户信息,写了一个实现类 用于对接第三方应用,在注入的bean时,直接使用 @Autoware 获取 bean 会直接使该 bean 为 null。报错如下:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.provider.nacos_provider.NacosProviderApplication]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'appLoginService' for bean class [com.cywetc.support.certificateclient.service.Impl.DefaultServiceImpl] conflicts with existing, non-compatible bean definition of same name and class [com.provider.nacos_provider.service.AppLoginServiceImpl]
 

        经过查阅资料发现:spring, filter加载顺序,影响了spring管理的bean的注入。因为 Filter 比 bean 先加载,也就是 Spring 会先加载 Filter 指定的类到 Container 中,这样 Filter 中注入的 Spring bean 就为 null 了。

web.xml 文件中一般包括 servlet, spring, filter, listenr的配置。那么他们是按照一个什么顺序加载呢?

加载顺序会影响对spring bean 的调用。

    比如filter 需要用到 bean ,但是加载顺序是 先加载filter 后加载spring,则filter中初始化操作中的bean为null;

首先可以肯定 加载顺序与他们在web.xml 文件中的先后顺序无关。

web.xml 中 listener 和 serverlet 的加载顺序为 先 listener 后serverlet

最终得出结果:先 listener >> filter >> servlet >> spring

解决方案: 

如果在Filter内想要注入需要的bean,可以在 init() 初始化方法中手动配置 bean。

 

此时,在doFilter()方法内,就可以使用apploginService这个bean了

 最后,项目可以正常启动了。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值