解决多线程下@Autowired无法注入
场景:
在使用爬虫框架Crawl4j时,由于Crawl4j采用多线程的方式,导致无法注入依赖:
这里@Autowired无法注入,redisTemplate一直为Null,所以不得不采用其他方式获取到redisTemplate。
解决方案:
采用手动获取Bean的形式获取。
创建一个工具类来获取Bean:
@Component
public class BeanContext implements ApplicationContextAware {
private static ApplicationContext applicationContext;
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 applicationContext.getBean(clz);
}
}
然后修改HtmlCrawler类如下:
即可获取到redisTemplate进行操作。