一、原因分析:
在多線程時使用@Autowired總是獲取不到bean,原因是:new thread不在spring容器中,也就無法獲得spring中的bean對象
二、解決方案:
手動獲取
代碼實現如下:
package com.test.configs;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@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 (T)applicationContext.getBean(clz);
}
}
線程類中的使用使用方法:
package com.test.handler;
import com.test.configs.BeanContext;
import com.test.service.TestService;
import com.test.model.User;
public class TestHandler implements Runnable {
private User user;
private TestService testService;
@Override
public void run() {
this.testService= BeanContext.getApplicationContext().getBean(TestService.class);
//這裏就可以使用service邏輯接口中的方法了
User user=testService.queryUserById(11);
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
若是是監聽器類的話,只需要在監聽器的執行方法中執行下面的代碼就可以實現:
TestService testService= BeanContext.getApplicationContext().getBean(TestService.class);
至此,多線程類中使用調用service接口爲null的問題就搞定了!