我在线程中对数据库进行操作需要引入mapper,如果直接在runnbable的实现类中@Autowired引入会发现mapper为空
解决方法:
1.有参构造声明,从外面引入.比如像beanName 的引入
2.从容器中获取已经声明的mapper
第一种`
SchedulingRunnable task = new SchedulingRunnable(beanName, taskMethod, cfgTask, params);
第二种
public SchedulingRunnable(String beanName, String methodName, CfgTask cfgTask, Object... params) {
this.beanName = beanName;
this.methodName = methodName;
this.cfgTask = cfgTask;
this.cfgTaskMapper = (CfgTaskMapper)SpringContextUtils.getBean("cfgTaskMapper");
this.cfgTaskParamMapper = (CfgTaskParamMapper)SpringContextUtils.getBean("cfgTaskParamMapper");
this.cfgTaskHisMapper = (CfgTaskHisMapper)SpringContextUtils.getBean("cfgTaskHisMapper");
this.cfgTaskLogMapper = (CfgTaskLogMapper)SpringContextUtils.getBean("cfgTaskLogMapper");
this.params = params;
}
package cn.witsky.oss.task;
import java.beans.Introspector;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
@Component
public class SpringContextUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringContextUtils.applicationContext == null) {
SpringContextUtils.applicationContext = applicationContext;
}
}
//获取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//通过name获取 Bean.
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
//通过class获取Bean.
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
//通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
//通过全类名获取简写name
public static String getBeanByFullName(String fullName) {
String shortClassName = ClassUtils.getShortName(fullName);
return Introspector.decapitalize(shortClassName);
}
}
注意点: runnable的启动方式:
Thread thread = new Thread(task, "OnceTask");
thread.start();
【线程的创建和启动的步骤(实现Runnable接口方式)】
1.定义Runnable接口的实现类,并重写其中的run方法。run()方法的方法体是线程执行体。
class SonThread implement Runnable{
public void run(){
…
}
}
2.创建Runnable接口实现类的实例。 sonThread s1=new SonThread();
3.用该实例作为Thread的target来创建Thread对象。 Thread t1 =new Thread(s1);
4.调用该对象的start()方法启动线程。 t1.start();
参考资料:
1.多线程spring注入的问题