线程当中注入Service的时候,程序一直在报NullPointerException

启动线程的时候注入Service的时候失败,这是因为在线程中为了线程安全,是防注入的
public class WebSiteHtmlUnitThread implements Runnable {
    
    @Autowired
    private RefereeProcessor refereeProcessor;   //这个时候启动线程的时候refereeProcessor是一个null,没有注入进去。
@Override public void run() {} }

解决方案:

package com.study.anti_fraud.antifaud_reptile_service.untils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;

/**
 * 线程当中注入Service注入不成功的时候,才有了此方法
 */
@Configuration
public class SpringContextUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    /**
     * 服务器启动,Spring容器初始化时,当加载了当前类为bean组件后,
     * 将会调用下面方法注入ApplicationContext实例
     */
    @Override
    public void setApplicationContext(ApplicationContext arg0) throws BeansException {
        System.out.println("初始化了");
        SpringContextUtil.applicationContext = arg0;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 用bean组件的name来获取bean
     *
     * @param beanName
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String beanName) {
        return (T) applicationContext.getBean(beanName);
    }

    /**
     * 用类来获取bean
     *
     * @param c
     * @return
     */
    public static <T> T getBean(Class<T> c) {
        return (T) applicationContext.getBean(c);
    }
}

如果SpringContextUtil类所在的包为com.study.anti_fraud,则只会扫描com.study.anti_fraud包及其子包内扫描。

而我刚开始将SpringContextUtil类放入到公共的common包当中了,所以一直包空指针。

那怎么解决呢?

那么需要在启动类中 配置注解@ComponentScan(basePackages={“com.study.common”}),


如果就在当前包下面则就不需要写这段内容了

posted @ 2022-03-31 15:14  —阿峰—  阅读(391)  评论(0编辑  收藏  举报