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

总结:


    用spring的@Autowired优先基于bean的名字注入(去首字母大写),找不到用类注入
    ApplicationContextHolder.getBean("storeOnlineVersionServiceImpl");---用工具类名字首字母大写

 

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

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

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

 
  1. import org.springframework.beans.BeansException;

  2. import org.springframework.context.ApplicationContext;

  3. import org.springframework.context.ApplicationContextAware;

  4. import org.springframework.stereotype.Component;

  5.  
  6. @Component

  7. public class SpringBeanUtil implements ApplicationContextAware {

  8. private static ApplicationContext applicationContext = null;

  9. @Override

  10. public void setApplicationContext(ApplicationContext applicationContext) throws

  11. BeansException {

  12. // TODO Auto-generated method stub

  13. SpringBeanUtil.applicationContext = applicationContext;

  14. }

  15.  
  16. /**

  17. * 从静态变量applicationContext中得到Bean, 自动转型为所赋值对象的类型.

  18. */

  19. @SuppressWarnings("unchecked")

  20. public static T getBean(String name) {

  21. if(name == null || applicationContext == null)

  22. return null;

  23. return (T) applicationContext.getBean(name);

  24. }

  25.  
  26. /**

  27. * 从静态变量applicationContext中得到Bean, 自动转型为所赋值对象的类型.

  28. */

  29. public static T getBean(Class clazz) {

  30. return applicationContext.getBean(clazz);

  31. }

  32.  
  33. }

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

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

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

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

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

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

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

 
  1. class DrawPics implements Runnable {

  2.  
  3. IVillageStandardService villageStandardServiceImpl;

  4.  
  5. @Override

  6. public void run() {

  7. villageStandardServiceImpl = SpringBeanUtil.getBean(IVillageStandardService.class);

  8. villageStandardServiceImpl.updateById(pictureParam);

  9. }

  10.  
  11. }

你可能感兴趣的:(spring项目中多线程@Autowire注入null的解决方案)