在多线程中注入spring对象

以前一般很少用多线程处理些问题,今天遇到一个问题,在kafka的消费端,我是启的多线程去消费kafka的数据,其中在多线程的业务代码中注入了server层的对象,但是在实际执行的时候却发现注入不了,然后检查spring的xml 包扫描的配置,发现配置没有问题,后面才发现在多线程的线程内部不能注入spring容器所管理的对象,细想一下: 应该是因为在web容器启动的时候,spring并不能感知还未执行的线程中的对象注入.

然后换了一种思路,就是在开启线程之前在main线程中先注入server层的对象,然后在执行线程的时候把该对象作为参数传入到线程内部执行,前提是这个对象必须是无状态的或者说是线程安全的.

当然也可以使用spring的上下文去getBean()来获取spring容器中的对象。

主线程的伪代码如下:


@Service
public class MainClassEG {

@Autowired
private ServiceEG service;

    public void methodEG {
        //执行消费
        for (int i = 0; i < 3; i++) {

            //在这里开启线程的时候传入spring注入的service
            //如果把@Autowired注解的private ServiceEG service;写在XxxThread线程类里面,spring是不能注入的
            executor.execute(new XxxThread(service,i);
        }
    }
}

XxxThread 线程的伪代码如下:

public class XxxThread implements Runnable {

    private ServiceEg service;
    private int threadFlag;

    public XxxThread(ServiceEg service, int threadFlag) {
        super();
        this.service = service;
        this.threadFlag = threadFlag;
    }

    public ServiceEg getService() {
        return service;
    }

    public void setService(ServiceEg service) {
        this.service = service;
    }

    public int getThreadFlag() {
        return threadFlag;
    }

    public void setThreadFlag(int threadFlag) {
        this.threadFlag = threadFlag;
    }

    @Override
    public void run() {
        service.doSomething(xxxx);
    }

}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值