Spring的xxxAware接口工作原理-筆記

1.Aware?接口的工作原理

Spring 提供了多個?XXXAware?接口(如?ApplicationEventPublisherAwareApplicationContextAwareBeanFactoryAware?等),這些接口的核心作用是讓 Bean?在初始化過程中自動獲取特定的依賴

  • 實現?Aware?接口的 Bean:當 Spring 容器創建一個實現了?Aware?接口的 Bean 時,容器會自動調用接口定義的?setXXX?方法,傳入對應的依賴對象
  • 無需?@AutowiredAware?接口的注入由 Spring 容器在 Bean 初始化階段自動觸發,不需要顯式使用?@Autowired?或構造函數注入。

2.Aware賦值過程演示

以ApplicationEventPublisherAware?的賦值過程為例,演示Aware賦值過程。

步驟 1:創建UserService的bean

當Spring 容器初始化?UserService(它實現了?ApplicationEventPublisherAware)時,檢測到UserService?實現了?ApplicationEventPublisherAware?接口,先執行步驟2.

@Service
public class UserService implements ApplicationEventPublisherAware {private ApplicationEventPublisher publisher;@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher publisher) {this.publisher = publisher; // 這里會被 Spring 自動調用}// 其他方法...
}
步驟 2:Spring 容器檢測到?Aware?接口

Spring容器檢測到?UserService?實現了?ApplicationEventPublisherAware?接口,因此會:

  1. 查找?ApplicationEventPublisher?的實現 Bean:Spring 容器會自動將?ApplicationContext?作為?ApplicationEventPublisher?的實現(ApplicationContext?是 Spring 容器的核心接口,它直接實現了?ApplicationEventPublisher?接口。因此,Spring 容器會將?ApplicationContext?自身作為?ApplicationEventPublisher?的實現傳入。)。
  2. 調用?setApplicationEventPublisher?方法:Spring容器自動調用setApplicationEventPublisher方法將?ApplicationContext?的實例賦值給?publisher?變量。
步驟 3:初始化完成,生成bean

最終,publisher?變量被賦值為?ApplicationContext?的實例,UserService初始化完成,生成對應的bean

總結:

當Spring容器創建UserService這個Bean的時候,它檢查到這個Bean實現了Aware接口Spring 容器自動調用?setApplicationEventPublisher?方法,將?ApplicationContext?的實例注入到?publisher?變量中。

在這個過程中,publisher變量的賦值是通過Spring容器在Bean初始化階段自動完成的,不需要開發者手動使用@Autowired或者其他注解。

3.Aware方式?vs?@Autowired?

兩種注入方式用法

使用Aware方式 和 使用@Autowired 引入bean的方式效果類似:

@Service
public class UserServiceWithAutowired {private final ApplicationEventPublisher publisher;@Autowiredpublic UserServiceWithAutowired(ApplicationEventPublisher publisher) {this.publisher = publisher;// 驗證 publisher 是 ApplicationContext 的實例System.out.println("UserServiceWithAutowired.publisher class: " + publisher.getClass().getName()); //輸出:UserServiceWithAutowired.publisher class: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext}//其他業務代碼...
}
@Service
public class UserServiceWithAware implements ApplicationEventPublisherAware {private ApplicationEventPublisher publisher;/*** Aware 類會在Spring啟動時自動設置 ApplicationEventPublisher** @param publisher*/@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher publisher) {this.publisher = publisher;System.out.println("UserServiceWithAware.publisher class: " + publisher.getClass().getName());// 輸出:UserServiceWithAware.publisher class: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext}//其他業務代碼...
}

啟動應用后,上面兩段代碼中的publisher均能賦值完成,對應輸出如下:

兩種注入方式對比

方案 1(Aware?接口)的特點:
  • 無需注解:完全依賴接口實現,適合舊版 Spring 或某些特殊場景(如無法修改構造函數的遺留代碼)。
  • 自動注入:Spring 容器在初始化 Bean 時自動調用?setXXX?方法。
  • 靈活性:可以注入多個?Aware?接口(例如同時實現?ApplicationContextAware?和?BeanFactoryAware)。
  • 注意事項:Aware接口的set方法必須嚴格按照命名規范,比如setApplicationEventPublisher,這樣Spring才能正確識別并調用。如果方法名不對,Spring可能無法正確注入。
方案 2(直接注入?ApplicationEventPublisher)的優勢:
  • 更簡潔:通過?@Autowired?或構造函數注入,代碼更清晰。
  • 符合現代 Spring 風格:推薦在新項目中使用,因為?Aware?接口在某些場景下可能顯得冗余。

總結:Aware?接口適合需要與容器深度集成的場景,通過這種方式,Spring 實現了依賴注入的另一種形式,無需顯式注解,完全依賴接口的約定。但現代開發更推薦直接通過依賴注入(如?@Autowired)的方式。

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

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

相關文章

Docker可用鏡像

加速域名 https://docker.sunzishaokao.comDockerHub鏡像加速器 - 免費Docker鏡像源國內加速 - DockerHub加速國內解決方案https://docker.1ms.runhttps://docker.1panel.livehttps://hub.rat.devhttps://docker.wanpeng.tophttps://doublezonline.cloudhttps://docker.mrxn.ne…

__proto__與prototype

__proto__與prototype的區別 基本概念剖析 #mermaid-svg-DXCtqoVX4u7x2Amd {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-DXCtqoVX4u7x2Amd .error-icon{fill:#552222;}#mermaid-svg-DXCtqoVX4u7x2Amd .error-tex…

在阿里云實例上部署通義千問QwQ-32B推理模型

通義千問QwQ-32B是阿里云開源的320億參數推理模型,通過大規模強化學習在數學推理、編程及通用任務中實現性能突破,支持消費級顯卡本地部署,兼顧高效推理與低資源消耗。 本文將介紹如何利用vLLM作為通義千問QwQ-32B模型的推理框架,在一臺阿里云GPU實例上構建通義千問QwQ-32…

SpringBoot獲取用戶信息常見問題(密碼屏蔽、駝峰命名和下劃線命名的自動轉換)

文章目錄 一、不返回password字段二、返回的createTime和updateTime為空原因解決:開啟駝峰命名和下劃線命名的自動轉換 一、不返回password字段 在字段上面添加JsonIgnore注解即可 JsonIgnore // 在把對象序列化成json字符串時,忽略該字段 private Str…

北斗導航 | 北斗衛星導航單點定位與深度學習結合提升精度

以下是北斗衛星導航單點定位(SPP)與深度學習結合提升精度的關鍵方法總結,綜合了誤差建模、信號識別、動態環境適應等技術方向: 一、非直射信號(NLOS)抑制與權重修正 1. 雙自注意力網絡(Dual Self-Attention Network) 原理:通過同時建模衛星信號的空間環境特征(如天空…

PostSwigger 的 CSRF 漏洞總結

本文所提供的關于 web 安全的相關信息、技術講解及案例分析等內容,僅用于知識分享與學術交流目的,旨在提升讀者對 web 安全領域的認知與理解。以下僅僅是作者對 PostSwigger Web 安全的知識整理和分享,嚴禁任何非法犯罪活動。 限制 CSRF 的三…

shell命令一

&> /dev/null yum -y install vsftpd &> /dev/null&> /dev/null &>:將命令的**標準輸出(stdout)和標準錯誤(stderr)**同時重定向。/dev/null:Linux中的“黑洞”設備&#xf…

Weiss Robotics的WPG與WSG系列緊湊型機器人夾爪,精準、靈活、高效

在自動化和智能制造領域,Weiss Robotics 以其創新的智能抓取系統而受到廣泛認可。本文將重點介紹 Weiss Robotics 的兩大產品系列:WPG 系列和 WSG 系列。這些產品系列憑借其先進的技術特性,為各行各業的自動化需求提供了高效、靈活的解決方案…

感受野(??Receptive Field??)

感受野(??Receptive Field??)是卷積神經網絡(CNN)中??一個神經元在輸入圖像上能“看到”的區域范圍??。簡單來說,它表示某個特征圖中的像素點,對應原始輸入圖像中的多大區域。 ??舉個栗子&#x…

真.從“零”搞 VSCode+STM32CubeMx+C <2>調試+燒錄

目錄 前言 準備工作 Daplink連接 調試配置(cortex-debug) 燒錄配置 坑點 前言 昨天有驚無險的構建了一個簡單的閃燈程序,今天來挑戰下調試燒錄,看看有什么坑。 準備工作 OpenOCD下載:openocd-xpackDaplink調試器…

ES6 Map/WeakMap/Set/WeakSet 全解指南

一、設計思想與核心概念 1. 解決傳統結構的痛點 Object:鍵只能是字符串/Symbol、無序、無size屬性Array:查找效率低(O(n))、無自動去重機制核心突破:// 傳統方式 vs ES6方式 const obj { [{}]: value }; // 鍵會被轉為"[object Obje…

算法篇-----滑動窗口

1.概念 所謂的滑動窗口,就是我們之前的雙指針的一個擴展應用,在上一章中,我們的雙指針是相向而行的,而這里的雙指針是同向而行的,由于其移動過程中像一個窗口一樣來回滑動,時大時小,而且還會來…

1.1探索 LLaMA-Factory:大模型微調的一站式解決方案

探索 LLaMA-Factory:大模型微調的一站式解決方案 引言 在大模型的時代,微調技術是將預訓練模型適配到特定任務的關鍵。LLaMA-Factory 作為一款強大的工具,為開發者提供了便捷且高效的大模型微調解決方案。本文將深入介紹 LLaMA-Factory 的基…

神經網絡筆記 - 感知機

一 感知機是什么 感知機(Perceptron)是一種接收輸入信號并輸出結果的算法。 它根據輸入與權重的加權和是否超過某個閾值(threshold),來判斷輸出0還是1。 二.計算方式 感知機的基本公式如下: X1, X2 : …

Pygame事件處理詳解:鍵盤、鼠標與自定義事件

Pygame事件處理詳解:鍵盤、鼠標與自定義事件 在游戲開發中,玩家的交互是至關重要的。無論是移動角色、觸發動作還是暫停游戲,都需要通過各種輸入來實現。Pygame作為一個功能強大的Python庫,提供了豐富的API來處理這些輸入,包括鍵盤、鼠標以及自定義事件。本文將詳細介紹如…

使用 Python 項目管理工具 uv 快速創建 MCP 服務(Cherry Studio、Trae 添加 MCP 服務)

文章目錄 下載Traeuv 工具教程參考我的這篇文章創建 uv 項目main.pyCherry Studio 添加 MCP 服務申請 DeepSeek API配置 DeepSeek API調用 MCP 服務 Trae 添加 MCP 服務添加 MCP創建智能體 使用智能體調用 MCP 創建 demo 表查詢 demo 表結構信息demo 表插入 2 條測試數據查詢 d…

為什么要學習《金剛經》

《金剛經》作為佛教般若經典的核心,以"緣起性空"為思想根基,通過佛陀與須菩提的對話,揭示了破除執著、見真實相的智慧。 以下從核心要義、精髓段落和現實應用三個維度進行解讀: 一、核心思想精髓 1. "凡所有相&am…

【MQ篇】RabbitMQ之消費失敗重試!

目錄 引言:消息不丟是底線,失敗了優雅重試是修養!消費失敗了,為啥不能老是原地復活?🤔智能重試策略一:本地重試(Spring Retry 的魔法)🏠?智能重試策略二&…

制作一款打飛機游戲33:碰撞體編輯

我們設置系統的方式使得編輯碰撞檢測框(即碰撞盒)并不容易。所以,我們的下一步是擴展我們的編輯器,尤其是精靈編輯器,以便我們能夠在編輯器中直接編輯碰撞盒。 編輯碰撞盒 讓我們加載Sprite編輯器。例如,這…

Kotlin和JavaScript的對比

Kotlin和JavaScript有一些相似之處,但也存在顯著的差異,下面從多個方面為你詳細分析: 相似點 1. 語法靈活性 變量聲明:二者在變量聲明上都較為靈活。在JavaScript里,借助var、let和const可以聲明變量。其中&#xf…