WebMagic多线程导致注解失效问题
在写毕设爬虫时用到了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;
@Override
public 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);
@Override
public void process(ResultItems resultItems, Task task) {
// 业务代码
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?