在写毕设爬虫时用到了WebMagic这个爬虫框架,由于采用了多线程进行爬取,在业务代码中发现注入的service一直为null,明明测试类使用的时候是正常的,后来查了好久的资料发现是多线程的情况下对象无法被注入。
中途一直换注解用@Autowired和@Resource试了好久,debug的方向一开始也没往多线程方向思考,歪打正着找着了解决办法,真是。。。
原因和解释可参考:多线程Spring注入对象问题的四种解法(@Autowired 注入为空)_spring 对象注入允许为空-CSDN博客
我的解决方法就是手动获取Bean,代码如下:
/*** @author Jun* @date 2024/4/9 18:54* @description BeanContext*/
@Component
public class BeanContext implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {BeanContext.applicationContext = applicationContext;}public static ApplicationContext getApplicationContext() {return applicationContext;}@SuppressWarnings("unchecked")public static <T> T getBean(String name) throws BeansException {return (T) applicationContext.getBean(name);}public static <T> T getBean(Class<T> clz) throws BeansException {return (T) applicationContext.getBean(clz);}
}// 具体使用
/*** @author Jun* @date 2024/4/9 17:14* @description NewsDataPipeline*/
@Component
@Slf4j
public class NewsDataPipeline implements Pipeline {// 多线程无法注入问题private INewsService iNewsService = BeanContext.getBean(INewsService.class);@Overridepublic void process(ResultItems resultItems, Task task) {// 业务代码}
}
参考
- 多线程Spring注入对象问题的四种解法(@Autowired 注入为空)_spring 对象注入允许为空-CSDN博客
- Java解决多线程无法@Autowired注入,手动获取Bean对象 - 趙小傑 - 博客园 (cnblogs.com)