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) {
        // 业务代码
    }
}

参考

  1. 多线程Spring注入对象问题的四种解法(@Autowired 注入为空)_spring 对象注入允许为空-CSDN博客
  2. Java解决多线程无法@Autowired注入,手动获取Bean对象 - 趙小傑 - 博客园 (cnblogs.com)
posted @ 2024-04-12 02:35  颜骏  阅读(13)  评论(0编辑  收藏  举报