Spring 实现线程接口 Runnable 注解注入失败 @Resource annotation is not supported on static fields

原因就是spring和多线程安全的问题,不让注入 
解决方案有以下几种

一.变量前缀加static,生成set方法并加上@Resource,记住把set方法 static 去掉,否则会抛出 @Resource annotation is not supported on static fields

private static VerificDao verificDao;
@Resource
public void setVerificDao(VerificDao verificDao) {
    CheckVoiceVerify.verificDao = verificDao;
}
  • 1
  • 2
  • 3
  • 4
  • 5

二.根据spring上下文环境获取bean

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringContextUtil implements ApplicationContextAware {

    // Spring应用上下文环境
    private static ApplicationContext applicationContext;

    /**
     * 实现ApplicationContextAware接口的回调方法,设置上下文环境
     */
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 获取对象 这里重写了bean方法,起主要作用
     */
    public static Object getBean(String beanId) throws BeansException {
        return applicationContext.getBean(beanId);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

三. 在启动这个线程的时候,在这个线程的构造函数中把需要注入的对象传过去

new Thread(new CheckVoiceVerify(verifyService)).start();

猜你喜欢

转载自blog.csdn.net/matthewwu/article/details/80922434