在項目開發中遇到一個問題,項目中使用了一個開源項目Quartz
(Quartz是一個完全由Java編寫的開源作業調度框架,為在Java應用程序中進行作業調度提供了簡單卻強大的機制。Quartz允許開發人員根據時間間隔來調度作業。這是百度的)。
具體業務就是在特定的時間去操作數據,但是這個時間屬性是由前台傳遞給后台的。
因此在Quartz的實現類在特定的時間需要使用Service接口,來修改數據庫的數值,
因此一開始我在Quartz的實現類中直接使用了@AUTOWIRED來進行注入;
不過測試了幾次之后發現,注入的serviceimpl都報了空指針錯誤!也就是說並沒有將service的實現成功注入;
后來一想,因為我調用Quartz的實現的時候是通過他的框架來進行工作;
接口提供的方法是傳遞Quartz的實現的CLASS,所以Quartz實現類的對象在內存中應該是不受Spring控制的,所以其中調用的service接口也不受spring控制,故此注入失敗,
解決方法1:
加入一個springBean管理工具:
package com.lewkay.demo.util; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import java.util.Map; /** * Spring bean獲取工具類 * Created by lk on 2017/2/16. */ public class SpringBeanFactoryUtils implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } /** * 獲取applicationContext對象 * @return */ public static ApplicationContext getApplicationContext(){ return applicationContext; } /** * 根據bean的id來查找對象 * @param id * @return */ public static Object getBeanById(String id){ return applicationContext.getBean(id); } /** * 根據bean的class來查找對象 * @param c * @return */ public static Object getBeanByClass(Class c){ return applicationContext.getBean(c); } /** * 根據bean的class來查找所有的對象(包括子類) * @param c * @return */ public static Map getBeansByClass(Class c){ return applicationContext.getBeansOfType(c); } }
后面,在任何不受spring管理的類中都可以使用此工具獲取受spring管理的bean了
寫的比較水,見諒!