spring项目中多线程@Autowire注入null的解决方案

时间:2025-03-17 07:29:06

很多时候,需要在多线程中使用业务层的方法实现自己的逻辑,但是多线程是防注入的,所以只是在多线程实现类中简单的使用@Autowired方法注入自己的Service,会在程序运行到此类调用service方法的时候提示注入的service为null。所以这里给出两种解决方案:

1.将需要使用的service当做多线程实现类的一个属性参数(也就是构造的时候当做参数或者没有构造的话使用set方法),然后在调用多线程,使用new的时候将该service赋值给实现类

2.写个获取springbean的帮助类,实现ApplicationContextAware接口:

import ;
import ;
import ;
import ;

@Component
public class SpringBeanUtil implements ApplicationContextAware {
	private static ApplicationContext applicationContext = null;
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws             
                BeansException {
		// TODO Auto-generated method stub
		 = applicationContext;
	}
	
	/**
	 * 从静态变量applicationContext中得到Bean, 自动转型为所赋值对象的类型.
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getBean(String name) {
		if(name == null || applicationContext == null)
			return null;
		return (T) (name);
	}
 
	/**
	 * 从静态变量applicationContext中得到Bean, 自动转型为所赋值对象的类型.
	 */
	public static <T> T getBean(Class<T> clazz) {
		return (clazz);
	}

}

用帮助类的时候应注意以下几点

a.如果是用注解形式注入spring容器(即不用spring的配置文件)的话,一定要使用@Component将此帮助类注入到spring容器中。此时可以通过上面clazz参数形式:clazz为在多线程中使用的service的类名.class(点class)。

b.帮助类中定义ApplicationContext类型的静态变量applicationContext,然后在获取bean的方法中使用该静态变量从spring容器中获取通过getBean方法获取容器中的bean。

c.当使用spring配置文件的时候,一定要使用<bean class="类的路径" />将帮助类注入到容器中。然后在多线程中使用serveri时获取bean的时候可以通过上面name参数形式:name一定是想要在多线程中使用的service在spring配置文件中注入的bean标签的id值,也可以通过上面clazz参数形式:clazz为在多线程中使用的service的类名.class(点class)。

d.帮助类获取bean的方法一定是static修饰静态方法

e.重要的事情说3遍:不管使用注解形式还是spring配置文件形式,帮助类一定要注入到spring容器中!!!不管使用注解形式还是spring配置文件形式,帮助类一定要注入到spring容器中!!!不管使用注解形式还是spring配置文件形式,帮助类一定要注入到spring容器中!!!

比如下面我用的是使用注解的方式:

class DrawPics implements Runnable {

	IVillageStandardService villageStandardServiceImpl;

	@Override
	public void run() {
			villageStandardServiceImpl = ();
			(pictureParam);
	}

}