在寫畢設爬蟲時用到了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) {
// 業務程式碼
}
}
參考
- 多執行緒Spring注入物件問題的四種解法(@Autowired 注入為空)_spring 物件注入允許為空-CSDN部落格
- Java解決多執行緒無法@Autowired注入,手動獲取Bean物件 - 趙小傑 - 部落格園 (cnblogs.com)