一、原因分析:
在多線程時使用@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的問題就搞定了!