问题描述:

在我们的监听器和拦截器类中使用@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;
    }

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