spring项目使用多线程时对象注入的问题

由于最近在写的项目需要使用到多线程提升效率,但是我在线程中调用注入对象的时候却发现始终为空,下面是我如何解决这个问题的方法。

原因分析

new thread对象不在spring容器中,所以无法通过@Autoware获去到spring的bean对象。

解决办法

为了解决这个问题,有以下几个思路

  1. 在声明成员变量的时候,将其定义为static的。这样都可以调用到
  2. 可以通过手动的方式获取
  3. 可以通过参数直接传入

重点讲解第二个方法

//创建一个工具类来获取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 getBean(String name) throws BeansException {
		return (T)applicationContext.getBean(name);
	}
	
	public static  T getBean(Class clz) throws BeansException {
	    return (T)applicationContext.getBean(clz);
	}
}
//创建thread
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);
        User user=testService.queryUserById(11);
    }
 
    public User getUser() {
        return user;
    }
 
    public void setUser(User user) {
        this.user = user;
    }
}

//其他service调用
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("upFinancial-pool-%d").build();
            ExecutorService pool = new ThreadPoolExecutor(corePoolSize, maxPoolSize,
                    6000L, TimeUnit.MILLISECONDS,
                    new LinkedBlockingDeque(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
            UpFinancialContractHandler handler=new UpFinancialContractHandler();
            handler.setUser(user);
            pool.execute(handler);

你可能感兴趣的:(JavaEE,SpringBoot)