由於是static方法去調用的是Spring管理的對象,而且static方法不能調用非靜態的方法,和屬性。
因爲static方法不依賴對象的創建,在類加載的時候就被加載進內存,因此static調用dao接口或service接口裏的方法時,接口的實現類也許並沒有被Spring管理並實例化爲對象。因此我們需要確保工具類被spring管理。並且在工具類中static方法調用普通方法之前,普通方法所在的類已經被Spring管理了並且實例化了。
代碼:
/**
* @version : V1.0
* @ClassName: FileUtils
* @Description:
* @Auther: Anakki
* @Date: 2019/4/29 14:35
*/
@Component
public class FileUtils {
//用於對數據庫操作的Dao接口,博主用的是
//Mybatis,由Mybatis調用接口返回數據庫數據。
@Resource
private FileStructureDao fileStructureDao;
//靜態化工具類變量
public static FileUtils fileUtils;
//註解用於告訴次代碼在Spring加載之前就運行
@PostConstruct
public void init(){
fileUtils = this;//工具類的實例賦值給fileUtils
fileUtils.fileStructureDao=this.fileStructureDao;//會激活Spring對Dao的管理並賦給此類
System.out.println("工具類已經初始化了,被納入spring管理");
//我們在初始化之後調用一下靜態方法
FileUtils.initFileStructure();
}
public static void initFileStructure(){
//查詢所有文件並輸出
List<FileInfo> fileInfos = fileUtils.fileStructureDao.retrieveFiles();
for (FileInfo fileInfo : fileInfos) {
System.out.println("===="+fileInfo);
}
}
}
運行結果:開始運行的時候報錯。後來查看是我的實體類 FileInfo 沒有空參構造,加上空參構造,就能運行了。
需要注意的是,調用static方法的時候,不能在springboot的啓動類裏調用,因爲啓動類執行的時候,工具類還未加載,更就不會有Spring去管理工具類的過程了。因此調用static方法時,需要保證在啓動類執行之後。
需要有@Component註解告訴Spring對此對象的管理,及 @Resource 用來告訴Spring注入需要的對象。