WebMagic多執行緒導致註解失效問題

颜骏發表於2024-04-12

在寫畢設爬蟲時用到了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) {
        // 業務程式碼
    }
}

參考

  1. 多執行緒Spring注入物件問題的四種解法(@Autowired 注入為空)_spring 物件注入允許為空-CSDN部落格
  2. Java解決多執行緒無法@Autowired注入,手動獲取Bean物件 - 趙小傑 - 部落格園 (cnblogs.com)

相關文章