很多时候,需要在多线程中使用业务层的方法实现自己的逻辑,但是多线程是防注入的,所以只是在多线程实现类中简单的使用@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);
}
}