天天看点

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;
    }