springboot中listener和interceptor中无法注入services和dao等其它bean

问题描述:

在我们的监听器和拦截器类中使用@Resource自动注入dao时一直为空

@WebListener
@Component
public class BootServiceListener implements ServletContextListener {

    @Resource
    private SyncUploadRecordDao syncUploadRecordDao;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
		   System.out.println(syncUploadRecordDao);
    }
}

即使我加了@Component也和之前一样 dao为空

原因分析:

网上查询有的说是拦截器和监听器是在spring上下文之前加载的,那个时候其它的bean还没有生成,就会报空指针异常。

还没搞明白:这是和springbean工厂的加载顺序有关还是springboot的自动装配组装有关系,那个@Component无法生效,我在其它的bean里面使用这个监听器和拦截器的注入时便可以生效,或者通过@Bean来注入这个bean到工厂中?这样不就和我没用它它就注入不了,注入dao为空吗?

解决方案:

以下两种方法可以解决问题

  • 在我们配置我们的监听器和拦截器的时候
    我们不能直接new一个监听器对象和拦截器对象
    而是应该使用bean工厂里面的那个
    @Resource
    private BootServiceListener bootServiceListener;

    @Bean
    public ServletListenerRegistrationBean listenerRegist() {
        ServletListenerRegistrationBean srb = new ServletListenerRegistrationBean();
        srb.setListener(bootServiceListener);
        System.out.println("listener");
        return srb;
    }
  • 或者我们写一个方法注入bean
    @Bean
    public BootServiceListener getBootServiceListener(){
        return new BootServiceListener();
    }

    @Bean
    public ServletListenerRegistrationBean listenerRegist() {
        ServletListenerRegistrationBean srb = new ServletListenerRegistrationBean();
        srb.setListener(getBootServiceListener());
        System.out.println("listener");
        return srb;
    }
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值