詳細分析Java類調用Service接口失效的注意事項(附Demo)

目錄

  • 前言
  • 1. 問題所示
  • 2. 原理分析
  • 3. 解決方法

前言

試錯了一小時,發現接口返回null!!
最后梳理其知識點并總結其原理

1. 問題所示

接口類如下:

public interface IInfoService extends BaseService<Info> {

錯誤方式一:(此處infoservice返回null值)

在這里插入圖片描述

錯誤方式二:(不使用注解,通過new實例化 也返回null值)
在這里插入圖片描述

2. 原理分析

在Spring MVC中,@Autowired@Resource等注解通常用于在Controller中注入Service,這是因為在Spring MVC中,Controller屬于Spring容器的一部分,因此可以自動注入其他由Spring管理的Bean,如Service

然而,在一般的類中,如果想要使用Service,直接使用new關鍵字實例化一個Service對象是不可取的


這是因為通過new實例化的對象是脫離了Spring容器的管理的,因此無法獲取到Spring容器中的注解屬性值,這樣可能會導致注入的Service為null。
即使該類被標記為@Component并且被Spring管理,直接通過new實例化Service的方式也無法注入依賴,因為這個實例不受Spring容器的管控。

為了解決這個問題,應該讓這個一般類也成為Spring容器的一個Bean,方法是使用@Component或者相關的注解,如@Service@Repository等。然后,在需要使用Service的地方,通過注入的方式將Service注入到這個一般類中,而不是通過new關鍵字實例化。這樣就能保證依賴注入成功,避免出現null的情況。

在實踐中,確保了類成為了Spring容器的一個Bean,并使用了適當的注解來進行依賴注入,可以有效避免由于依賴注入失敗而導致的空指針異常等問題

springboot不支持注入靜態屬性,使用`@Autowired等注解注入會失敗

3. 解決方法

使用如下方式:

@Component
public class CommonUtil {@Autowiredprivate IInfoService infoService;public static CommonUtil commonUtil;@PostConstructpublic void init() {commonUtil = this;}

最終在調用inforservice方法時,通過使用commonUtil.infoService.list

在這里插入圖片描述

主要的步驟邏輯如下:

  1. @Component注解標記了CommonUtil類,使其成為了Spring容器的一個Bean,因此Spring會對其進行管理
  2. @Autowired注解標記了infoService字段,告訴Spring在初始化CommonUtil的時候,自動注入一個IInfoService類型的實例
  3. @PostConstruct注解標記了init()方法,這意味著在CommonUtil實例創建完成并且所有的依賴注入完成后,Spring會調用init()方法。在init()方法中,將當前實例賦值給了靜態的commonUtil對象
  4. 通過將commonUtil對象設置為靜態的,使得其他類可以通過CommonUtil.commonUtil來訪問CommonUtil類的實例,從而間接獲取到了IInfoService的實例

這種方法雖然能夠解決在普通類中使用Service的問題,但要注意以下幾點:

  • 靜態變量commonUtil可能存在線程安全問題,如果多個線程同時訪問該變量,可能會出現競態條件。
  • 靜態變量的使用會增加類的耦合度,降低代碼的可維護性和可測試性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718276.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718276.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718276.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Zookeeper】ZooKeeper的一些重要功能和作用

&#x1f34e;個人博客&#xff1a;個人主頁 &#x1f3c6;個人專欄&#xff1a;日常聊聊 ?? 功不唐捐&#xff0c;玉汝于成 目錄 前言 正文 結語 我的其他博客 前言 隨著分布式系統的普及和應用場景的不斷增加&#xff0c;構建可靠、高效的分布式系統變得愈發重要。然…

Vue 3 中如何遷移從 Vue 2 的項目?

引言 Vue.js 是一個流行的前端框架&#xff0c;它以其響應式數據綁定和組件化系統而聞名。隨著時間的推移&#xff0c;Vue.js 也在不斷發展和改進。Vue 3 是 Vue.js 的一個重大更新&#xff0c;它帶來了許多新特性和改進&#xff0c;包括更好的性能、更小的體積、更強大的組合…

C 嵌入式系統設計模式 19:保護調用模式

本書的原著為&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;講解的是嵌入式系統設計模式&#xff0c;是一本不可多得的好書。 本系列描述我對書中內容的理解。本文章描述嵌入式并發和資源管理模式之五…

Cesium 3D Tiles 簡介

3D Tiles 是大規模異構 3D 地理空間數據集&#xff08;例如點云、建筑物和攝影測量&#xff09;的開放標準。3D Tiles 基于 glTF 和其他 3D 數據類型構建&#xff0c;是一種可類似二維瓦片模式的流式傳輸的優化格式&#xff0c;旨在適應當今不斷增長的 3D 地理空間數據集的渲染…

編碼規范(前端)

文章目錄 1. 文檔說明1.1 編制說明1.2 名詞解釋 2.前端研發規范2.1 HTML編碼規范2.1.1 文檔類型2.1.2 語言2.1.3 元數據2.1.4 資源加載2.1.5 頁面標題2.1.6 編碼風格2.1.7 標簽2.1.8 屬性2.1.9 語義化 2.2 CSS編碼規范2.2.1 文件引用2.2.2 命名-組成元素 知識點 1. 文檔說明 1…

【數據分享】1979~2020年MSWEP降水數據集

各位同學們好&#xff0c;今天和大伙兒分享的是1979~2020年MSWEP降水數據集。如果大家有下載處理數據等方面的問題&#xff0c;您可以私信或者評論。 Beck, H. E., E. F. Wood, M. Pan, C. K. Fisher, D. G. Miralles, A. I. J. M. van Dijk, T. R. McVicar, and R. F. Adler, …

【軟件設計師】通俗易懂的去了解算法的特性和要求

&#x1f413; 算法 算法是對特定問題求解步驟的一種描述&#xff0c;算法是指令的有限序列。其中每一條指令表示一個或者多個操作。 &#x1f413; 算法的5種屬性 有窮性 一個算法必須總是在執行有窮的步驟后&#xff0c;且在每個步驟執行的過程中時間是有限的 1.有窮性意味…

深度學習 精選筆記(7)前向傳播、反向傳播和計算圖

學習參考&#xff1a; 動手學深度學習2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、請聯系侵刪。 ②已寫完的筆記文章會不定時一直修訂修改(刪、改、增)&#xff0c;以達到集多方教程的精華于一文的目的。 ③非常推薦上面&#xff08;學習參考&#x…

藍橋杯:單詞分析

題目 題目描述 小藍給學生們組織了一場考試&#xff0c;卷面總分為 100 分&#xff0c;每個學生的得分都是一個 0 到 100 的整數。 如果得分至少是 60 分&#xff0c;則稱為及格。如果得分至少為 85 分&#xff0c;則稱為優秀。 請計算及格率和優秀率&#xff0c;用百分數表…

Rstudio-深度學習執行代碼

RStudio是一個開源的集成開發環境&#xff08;IDE&#xff09;&#xff0c;專門用于R編程語言的開發和數據分析。R語言是一種流行的統計計算和數據可視化語言&#xff0c;廣泛用于數據科學、統計學和機器學習領域。 RStudio提供了許多功能強大的工具&#xff0c;包括代碼編輯器…

SQL 基本條件查詢DQL 練習

DQL DQL&#xff08;Data Query Language&#xff09;是SQL語言中的一種類型&#xff0c;用于執行數據查詢操作。它是SQL的一部分&#xff0c;用于從數據庫中檢索數據。DQL語句用于從一個或多個表中選擇、過濾和排序數據。常見的DQL查詢語句包括SELECT、FROM、WHERE、GROUP BY…

U盤無法讀取?輕松掌握正確解決方法!

“為什么我的u盤插入電腦后會顯示無法讀取呢&#xff1f;想查看一些比較重要的文件&#xff0c;但就是無法讀取U盤&#xff0c;想問問大家&#xff0c;我應該怎么操作呢&#xff1f;” U盤作為一種便捷的數據存儲設備&#xff0c;廣泛應用于我們的日常生活和工作中。然而&#…

獨立游戲《星塵異變》UE5 C++程序開發日志2——創建并編寫一個C++類

在本篇日志中&#xff0c;我們將要用一個C類來實現一個游戲內的物品&#xff0c;同時介紹UCLASS、USTRUCT、UPROPERTY的使用 一、創建一個C類 我們在UE5的"內容側滑菜單"中&#xff0c;在右側空白中右鍵選擇"新建C類"&#xff0c;然后可以選擇一個想要的…

python70-Python的函數入門,了解下函數

函數是執行特定任務的一段代碼,程序通過將一段代碼定義成函數,并為該函數指定一個函數名,這樣即可在需要的時候多次調用這段代碼。因此,函數是代碼復用的重要手段。學習函數需要重點掌握定義函數、調用函數的方法。 與函數緊密相關的另一個知識點是lambda表達式。lamda表達…

Spring AOP(Aspect-Oriented Programming,面向切面編程)介紹

Spring AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面編程&#xff09;是Spring框架的一個重要模塊&#xff0c;它提供了一種強大的方式來幫助開發者實現橫切關注點&#xff08;cross-cutting concerns&#xff09;的模塊化。橫切關注點是指那些影響多個模塊…

Linux設備模型(十一) - platform設備

一&#xff0c;platform device概述 在Linux2.6以后的設備驅動模型中&#xff0c;需關心總線、設備和驅動這3個實體&#xff0c;總線將設備和驅動綁定。在系統每注冊一個設備的時候&#xff0c; 會尋找與之匹配的驅動&#xff1b;相反的&#xff0c;在系統每注冊一個設備的時…

【Redis】實際應用 - 緩存

文章目錄 1. 緩存的基本概念2. Redis作為緩存的優勢2.1 內存存儲2.2 持久性選項2.3 數據結構豐富 3. Redis緩存的使用3.1 安裝和配置Redis3.2 連接到Redis3.3 存儲和獲取數據3.4 設置過期時間 4. 緩存策略4.1 LRU&#xff08;最近最少使用&#xff09;4.2 數據失效4.3 主動刷新…

可讓照片人物“開口說話”阿里圖生視頻模型EMO,高啟強普法

3 月 1 日消息&#xff0c;阿里巴巴研究團隊近日發布了一款名為“EMO&#xff08;Emote Portrait Alive&#xff09;”的 AI 框架&#xff0c;該框架號稱可以用于“對口型”&#xff0c;只需要輸入人物照片及音頻&#xff0c;模型就能夠讓照片中的人物開口說出相關音頻&#xf…

PDN分析及應用系列二-簡單5V電源分配-Altium Designer仿真分析-AD

PDN分析及應用系列二 —— 案例1:簡單5V電源分配 預模擬DC網絡識別 當最初為PCB設計打開PDN分析儀時,它將嘗試根據公共電源網絡命名法從設計中識別所有直流電源網絡。 正確的DC網絡識別對于獲得最準確的模擬結果非常重要。 在示例項目中已經識別出主DC網絡以簡化該過程。 …

Vulnhub靶機:Bellatrix

一、介紹 運行環境&#xff1a;Virtualbox 攻擊機&#xff1a;kali&#xff08;10.0.2.4&#xff09; 靶機&#xff1a;Bellatrix&#xff08;10.0.2.9&#xff09; 目標&#xff1a;獲取靶機root權限和flag 靶機下載地址&#xff1a;https://www.vulnhub.com/entry/hogwa…