在线程中使用 @Autowired自动注入了,但是执行报空指针,jdbcTemplate为空,使用new AllSubmitNumThread()导致自动注入失效了
public class AllSubmitNumThread extends Thread{
@Autowired
JdbcTemplate jdbcTemplate;
}public class A{
AllSubmitNumThread t1 = new AllSubmitNumThread ();
t1.start();
}
解决方案:
使用获取bean对象的工具类,既然程序无法通过注解拿到需要的bean,那就只好自己写个工具类来获取喽,下面是工具类代码,直接复制过去就能用
package com.backstage.config;import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * @ProjectName: * @Package: com.backstage.config * @ClassName: ApplicationContextProvider * @Description: 获取bean对象的工具类 * @Author: wangzhilong * @CreateDate: 2018/8/31 13:26 * @Version: 1.0 */ /** * Author:ZhuShangJin * Date:2018/7/3 */ @Component public class ApplicationContextProvider implements ApplicationContextAware { /** * 上下文对象实例 */ private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } /** * 获取applicationContext * * @return */ public static ApplicationContext getApplicationContext() { return applicationContext; } /** * 通过name获取 Bean. * * @param name * @return */ public static Object getBean(String name) { return getApplicationContext().getBean(name); } /** * 通过class获取Bean. * * @param clazz * @param <T> * @return */ public static <T> T getBean(Class<T> clazz) { return getApplicationContext().getBean(clazz); } /** * 通过name,以及Clazz返回指定的Bean * * @param name * @param clazz * @param <T> * @return */ public static <T> T getBean(String name, Class<T> clazz) { return getApplicationContext().getBean(name, clazz); } }
使用方法:
public class AllSubmitNumThread extends Thread{
JdbcTemplate jdbcTemplate;AllSubmitNumThread(){
this.jdbcTemplate = ApplicationContextProvider.getBean(JdbcTemplate.class);
}
}