在線程中使用@Resource或者@Autowired注入全部爲NULL,
原來是Spring不能在線程中注入。
有兩種方法可以參考,以下方法本人在實際項目中都已使用到過
- 要的Bean作爲線程的的構造函數的參數傳入
- 使用ApplicationContext.getBean方法來靜態的獲取Bean
構造方法的不做細講,這次講下第二種,在線程中不能注入那就重新獲取bean吧
這裏需要有一個獲取bean的封裝類,作爲分享也是給自己做個記錄
public class SpringApplicationContextHolder implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext context) {
SpringApplicationContextHolder.context = context;
}
public static ApplicationContext getContext() {
return context;
}
public static <T> T getBean(String name) {
return (T) context.getBean(name);
}
public static <T> T getBean(String name, ApplicationContext applicationContext) {
return (T) applicationContext.getBean(name);
}
public static <T> T getBean(Class<T> clazz) {
Map<String, T> beanMaps = context.getBeansOfType(clazz);
if (beanMaps != null && !beanMaps.isEmpty()) {
return beanMaps.values().iterator().next();
} else {
return null;
}
}
public static <T> T getBean(Class<T> clazz, ApplicationContext applicationContext) {
Map<String, T> beanMaps = applicationContext.getBeansOfType(clazz);
if (beanMaps != null && !beanMaps.isEmpty()) {
return beanMaps.values().iterator().next();
} else {
return null;
}
}
}
如何使用?
AbcMapper abcMapper = SpringApplicationContextHolder.getBean(AbcMapper.class);
另外網上還有一種方法,本人未實踐,這裏就放個鏈接https://www.cnblogs.com/bencakes/p/6139542.html吧,實踐過有效的朋友可以評論處告知下