quartz 集成 spring 无法自动注入 @Autowired失效

quartz 有自己的context 而无法直接使用spring容器中的相关对象

网上大多数都是使用通过继承AdaptableJobFactory然后再application.xml中配置

public class MyJobFactory extends AdaptableJobFactory {

    //这个对象Spring会帮我们自动注入进来,也属于Spring技术范畴.
    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;
    
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        //调用父类的方法
        Object jobInstance = super.createJobInstance(bundle);
        //进行注入,这属于Spring的技术,不清楚的可以查看Spring的API.
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}


  
  

但是不知道为什么行不通。。依旧报java.lang.NullPointerException,在google上面 的处理方式也大同小异

相关问题:https://stackoverflow.com/questions/25719179/quartz-does-not-support-autowired

 既然网上的答案没啥用。。就只能曲线救国了。。

自动注入失败是因为没有办法获得spring的相关service对象。没办法获得对象是因为context不一样,quartz不受spring管理

那么从spring中获得相关的bean就好了。。

@Component
public class SpringUtil implements ApplicationContextAware {

    private static final Logger logger = LoggerFactory.getLogger(SpringUtil.class);

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (SpringUtil.applicationContext == null) {
            SpringUtil.applicationContext = applicationContext;
        }
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    // 通过name获取 Bean.
    @SuppressWarnings("unchecked")
    public static  T getBean(String name) {
        return (T) getApplicationContext().getBean(name);
    }

    // 通过class获取Bean.
    public static  T getBean(Class clazz) {
        return getApplicationContext().getBean(clazz);
    }

    // 通过name,以及Clazz返回指定的Bean
    public static  T getBean(String name, Class clazz) {
        return getApplicationContext().getBean(name, clazz);
    }

}

 public BaseDao getDao(){
      return SpringUtil.getBean(BaseDao.class);
    }

这样就可以获得spring中的对象, 成功运行。。

你可能感兴趣的:(日常问题)