靜態方法,或工具類如何調用Spring管理的對象,調用Dao,Service接口方法時,普通調用方式報空指針異常:解決方案。

由於是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注入需要的對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章