使用runnable的注意事项

我在线程中对数据库进行操作需要引入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注入的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值