线程当中注入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”}),
如果就在当前包下面则就不需要写这段内容了