【最簡單的解決方案】spring框架中普通類(工具類)呼叫service
這套解決方案,純屬博主自己琢磨相出,絕非網上那些隨意轉載的解決方案!!
----前言
今天,公司要求我在springboot框架【通用於所有spring專案】的專案中新增一個日誌記錄的操作,大致實現方案就是提供一個日誌工具類,然後將controller層中的資料,通過呼叫這個工具類提供的方法寫入資料庫;
該工具類方法的主要實現邏輯:通過呼叫service,然後再通過mapper操作將資訊寫入資料庫。
要解決的難點:如何在工具類中呼叫service,然後將寫入資料庫。
為了更好的描述問題,先將部分主要程式碼提供給大家。
Logger就是工具類,下方程式碼是在Controller中呼叫工具類的方法。
下方是Logger工具類中注入ServiceImpl的主要程式碼
相信這一步,大家都已經做到了,博主高高興興的便去執行程式碼了,結果報空指標異常!!!
,接下來博主便開始debug,發現上面的manageServiceImpl竟然是null!!
那麼接下來需要解決的問題即是:上方的實現根本沒有讓ServiceImpl注入進來。
然後機智的樓主想到,既然你是null,那好,我手動給你建立一個,便new了一個ManageService物件,再去進行資料庫操作,結果並不樂觀,依然空指標異常!!!
下一步,好,我找度娘求助。解決辦法真是讓人眼花繚亂啊,最多的解決方法就是如下所示:
博主尖叫一聲,這TM什麼雞雞,從來沒有的玩法,評論裡竟然一片稱讚。。。抱著試試的態度,結果依然涼涼。
但是,博主就是有一股拼的勁頭,不搞明白決不罷休,俗話說的好,萬變不離其宗,博主決定重新學習spring容器管理物件的基礎知識,終於。。。。。找到了原因。
先列出解決方案,只需要在之前的程式碼上改動一點即可:
在之前的Controller層中注入工具類物件:
注意,注意,最最主要的就是這一點了!!
一定一定要用注入進來的工具類物件,去呼叫工具類的方法!
好了,問題完美解決!!!
下面分析原因:之前博主呼叫工具類方法時,是手動new出來的工具類,正是因為是手動new出來的物件,所以不歸spring容器管理,繼而,這個物件裡面的成員屬性(即serviceImpl)自然不能注入進來。而當我使用注入進來的工具類物件時,此時物件是由spring容器管理的,所以此物件中的成員屬性(即serviceImpl)是可以注入進來的,繼而完美!!!