Spring Bean初始化及@PostConstruc執行順序

目錄

1. Bean初始化執行順序

2. 成員變量初始化順序

2.1?普通Java類(非Spring環境)

(1) 默認初始化(即初始分配內存)

(2) 顯式初始化

(3) 構造器初始化

(4)完整順序

2.2 Spring管理的Bean(依賴注入場景)

(1) 普通成員變量

(2) 依賴注入的成員變量

(3) 生命周期回調的影響

(4)關鍵區別總結

2.3 final?成員變量?

2.4 常見面試問題


1. Bean初始化執行順序

  1. 構造函數?- 首先調用Bean的構造函數

  2. 依賴注入?- 完成所有依賴項的注入(@Autowired等)

  3. @PostConstruct方法?- 執行帶有@PostConstruct注解的方法

  4. InitializingBean的afterPropertiesSet()?- 如果Bean實現了InitializingBean接口

  5. 自定義init方法?- 執行通過@Bean(initMethod="...")或XML配置中init-method指定的方法

@Component
public class ExampleBean implements InitializingBean {public ExampleBean() {System.out.println("1. 構造函數");}@Autowiredpublic void setDependency(SomeDependency dep) {System.out.println("2. 依賴注入");}@PostConstructpublic void postConstruct() {System.out.println("3. @PostConstruct方法");}@Overridepublic void afterPropertiesSet() {System.out.println("4. InitializingBean的afterPropertiesSet()");}@Bean(initMethod = "customInit")public void customInit() {System.out.println("5. 自定義init方法");}
}

2. 成員變量初始化順序

在Java中,類的成員變量(非靜態成員變量)的初始化時機取決于其定義方式(直接賦值、構造器賦值、初始化塊等)以及是否涉及依賴注入(如Spring框架)。

2.1?普通Java類(非Spring環境)

成員變量的初始化順序和時機如下:

(1) 默認初始化(即初始分配內存)

  • 時機:對象實例化時(new關鍵字調用構造器之前)。

  • 規則:所有成員變量先被賦予默認值(int0booleanfalse,引用類型→null等)。

(2) 顯式初始化

  • 時機:緊隨默認初始化之后,按代碼中的聲明順序執行。

  • 方式

    • 直接賦值:

public class MyClass {private int a = 10;          // 顯式賦值private String s = "hello";  // 顯式賦值
}

  • 初始化塊(代碼塊):
public class MyClass {private int x;{x = 20; // 初始化塊賦值}
}

(3) 構造器初始化

  • 時機:在顯式初始化之后,構造器最后執行。

  • 特點:構造器中的賦值會覆蓋之前的默認值或顯式賦值。

public class MyClass {private int value;public MyClass() {this.value = 30; // 構造器賦值}
}

(4)完整順序

默認值 → 顯式賦值/初始化塊 → 構造器賦值


2.2 Spring管理的Bean(依賴注入場景)

在Spring中,成員變量的初始化分為依賴注入普通成員變量初始化兩部分:

(1) 普通成員變量

  • 初始化規則與普通Java類一致(默認值 → 顯式賦值 → 構造器)。

  • 示例

@Component
public class MyBean {private int count = 100;  // 顯式賦值(Spring無關)public MyBean() {this.count = 200;     // 構造器覆蓋}
}

(2) 依賴注入的成員變量

  • 時機:在Bean實例化后,由Spring容器通過反射或Setter方法注入。

    • 字段注入(@Autowired
      在構造器和顯式賦值之后,通過反射直接注入。

      @Component
      public class MyBean {@Autowiredprivate Dependency dependency; // Spring在對象構造后注入
      }

    • 構造器注入
      在實例化時通過構造器參數注入(等同于普通Java的構造器賦值)。

      @Component
      public class MyBean {private final Dependency dependency;public MyBean(Dependency dependency) {this.dependency = dependency; // 構造時注入}
      }

(3) 生命周期回調的影響

  • @PostConstruct方法會在依賴注入完成后執行,此時所有成員變量(包括注入的依賴)已就緒:

    @Component
    public class MyBean {@Autowiredprivate Dependency dependency;@PostConstructpublic void init() {System.out.println(dependency); // 依賴已注入}
    }

(4)關鍵區別總結

場景成員變量初始化時機
普通Java類默認值 → 顯式賦值/初始化塊 → 構造器賦值
Spring Bean(字段注入)默認值 → 顯式賦值 → 構造器 → 依賴注入 →?@PostConstruct
Spring Bean(構造器注入)與普通Java類相同,依賴通過構造器參數傳入

2.3 final?成員變量?

  • 必須聲明時、初始化塊或構造器中賦值,否則編譯錯誤。

public class MyClass {private final int x = 10;  // 聲明時賦值private final int y;{ y = 20; }  // 初始化塊賦值private final int z;public MyClass() {z = 30;  // 構造器賦值}
}

2.4 常見面試問題

Q1: 為什么構造器里的賦值能覆蓋顯式賦值?

因為構造器是最后執行的,可以修改之前的值。

Q2: 以下代碼的輸出是什么?

public class Test {private int x = 10;{ x = 20; }public Test() {System.out.println(x);x = 30;}public static void main(String[] args) {new Test(); // 輸出?}
}
--
答案:20(顯式賦值和初始化塊先執行,構造器最后執行)。

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

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

相關文章

webRTC合并本地源碼修改和官方更新

一、總體思路:基于 Git 分支管理改動origin/main 是官方 WebRTC 主干(來自 webrtc.googlesource.com)。my/webrtc 是你自己開發和修改的分支。每次 Google 更新 WebRTC,你從 origin/main 拉新代碼,再把 my/webrtc 分支…

c++注意點(12)----設計模式(生成器)

創建型模式生成器模式(Builder Pattern)是一種創建型設計模式,它專注于將復雜對象的構建過程與表示分離,使得同樣的構建過程可以創建不同的表示。就像是做飯,你可以自己慢慢做,各個步驟自己選擇。而使用生成…

[特殊字符] VLA 如何“繞過”手眼標定?—— 當機器人學會了“看一眼就動手”

🔮 VLA 如何“繞過”手眼標定?—— 當機器人學會了“看一眼就動手” 作者:石去皿 發布時間:2025年7月 在傳統機器人系統中,“手眼標定”是每一個工程師都繞不開的課題。 你必須精確測量相機和機械臂之間的空間變換關系…

《Maven 核心基礎筆記(第一天)》

1.說明maven軟件依賴管理和項目構建功能maven是為Java項目工作的 功能體現:依賴管理,項目構建 依賴管理:我們只需要寫配置文件(pom.xml),maven就會幫我們下載依賴,并且也會下載依賴的依賴。 項目構建:項目源…

Yolo底層原理學習(V1~V3)(第一篇)

一,卷積后的特征圖大小計算眾所周知,提到深度學習,必不可少的會提及卷積,那么如何計算卷積之后的圖片大小呢?下圖呈現:如圖, 我們令FH,FW為原圖像的長度FH*FW。P為padding的長度&…

前端開發項目性能瓶頸分析

1. 使用 rollup-plugin-visualizer 分析構建 借助 rollup-plugin-visualizer 插件,可以分析通過 rollup 構建出的產物內容,并生成可視化圖表,幫助你分析打包后的文件大小以及各個模塊的占用情況。 1.1. 安裝插件 你需要在你的項目中安裝 r…

ExoData.h - OpenExo

ExoData.h文件定位源代碼1. 頭文件依賴2. 核心類聲明3. 主要成員函數關節遍歷工具關節與配置相關數據/狀態操作控制參數/校準4. 主要成員變量總結文件定位 位置:src/ExoData.h 作用:定義 ExoData 類,作為 Exo 系統全局數據的核心容器。它將設…

緩存HDC內容用于后續Direct2D繪制.

思路&#xff1a;把HDC里的內容保存到Direct2D格式的位圖里&#xff0c;后續直接調用 renderTarget->DrawBitmap即可。本例中&#xff0c;位圖將保存為類的字段。本例中 COM 接口指針皆使用 com_ptr&#xff0c;這是 WinRT 的 COM 智能指針類&#xff0c;com_ptr<I>::…

“抓了個寂寞”:一次實時信息采集的意外和修復

1. 那天下午&#xff0c;輿情系統“遲到”了 那天下午&#xff0c;公司運營那邊突然在群里喊&#xff1a;“XX事件都快上熱搜榜前十了&#xff0c;咱們系統咋沒反應&#xff1f;” 我愣了幾秒&#xff0c;立馬翻后臺日志、爬蟲執行記錄&#xff0c;結果一查&#xff0c;還真有點…

數據結構之迪杰斯特拉算法

前言&#xff1a;前面兩篇文章介紹了生成圖的最小生成樹的算法&#xff0c;接下來兩篇文章會介紹圖的最短路徑的算法&#xff0c;迪杰斯特拉算法和弗洛伊德算法。迪杰斯特拉算法是用來計算一個點到其他所有點的最短路徑&#xff0c;這個點稱之為源點。 一、實現流程 回憶一下…

技術文檔 | OpenAI 的 Kafka 演進之路與 Pulsar 遷移潛力

導讀ChatGPT 用戶量指數級暴漲&#xff0c;OpenAI 的 Kafka 集群在一年內增長 20 倍至 30 個集群[1]&#xff0c;其 Kafka 架構面臨日均千億級消息&#xff08;峰值 QPS 800萬/秒&#xff09; 的壓力。這揭示了一個關鍵事實&#xff1a;OpenAI 的成功不只依賴模型&#xff0c;更…

【bug】 jetson上opencv無法錄制h264本地視頻

在Jetson Orin NX上無法使用opencv直接錄制h264/h265視頻流&#xff08;h264格式的視頻流才能在瀏覽器播放&#xff09; 解決&#xff1a; 軟件編碼&#xff1a;需要源碼編譯opencv 1.環境準備 pip uninstall opencv-python sudo apt install build-essential cmake git python…

解決http的web服務中與https服務交互的問題

問題背景&#xff1a; 需要在一個http的web服務中直接跟另一個https服務交互&#xff0c;不經過自身后端。 又來到了熟悉的跨域訪問問題。 解決邏輯就是使用nginx轉發&#xff0c;涉及到的文件也就是nginx.conf文件&#xff0c;前面解決minio鏈接時已經有經驗了&#xff0c;但…

網站訪問信息追蹤系統在安全與性能優化中的關鍵作用——網絡安全—仙盟創夢IDE

<?php // 收集訪問信息 $visitorInfo未來之窗 [timestamp > date(Y-m-d H:i:s),ip > $_SERVER[REMOTE_ADDR] ?? unknown,page > $_SERVER[REQUEST_URI] ?? unknown,method > $_SERVER[REQUEST_METHOD] ?? unknown,user_agent > $_SERVER[HTTP_USER_A…

Oracle 時間處理函數和操作符筆記

前言 寫sql時經常用到時間處理函數&#xff0c;我整理了一份Oracle的常用sql筆記,供大家參考。 如果對你有幫助&#xff0c;請點贊支持~ 多謝&#x1f64f; 筆記 -- 1. 獲取當前日期和時間 -- SYSDATE, SYSTIMESTAMP, CURRENT_DATE, CURRENT_TIMESTAMP, LOCALTIMESTAMP SELE…

TDengine時序數據庫 詳解

1. TDengine 簡介 TDengine 是一款 高性能、分布式、支持 SQL 的時序數據庫&#xff08;Time-Series Database, TSDB&#xff09;&#xff0c;專為 物聯網&#xff08;IoT&#xff09;、工業互聯網、金融監控、日志分析 等場景設計。其核心特點包括&#xff1a; 超高性能&…

【IDEA】idea怎么修改注冊的用戶名稱?

文章目錄[toc]問題**方法 1&#xff1a;通過 JetBrains 賬戶網站修改****方法 2&#xff1a;通過 IDEA 內跳轉修改&#xff08;快捷方式&#xff09;****注意事項****補充&#xff1a;修改 IDEA 內的項目級用戶名**如何退出IDEA用戶登錄&#xff1f;問題 在 IntelliJ IDEA 中修…

AR眼鏡重塑外科手術導航:精準“透視”新突破

在現代醫學領域&#xff0c;增強現實&#xff08;AR www.teamhelper.cn &#xff09;技術正以前所未有的方式改變外科手術導航的面貌。通過為醫生提供實時的三維可視化、精準的空間定位和智能交互功能&#xff0c;AR眼鏡正在成為手術室中的重要工具。本文將系統介紹AR眼鏡在手術…

服務端對接 HTTP 接口傳輸圖片 采用base64還是 multipart/form-data

在服務端對接HTTP接口傳輸圖片時&#xff0c;選擇 multipart/form-data 還是 Base64 編碼&#xff0c;需要根據具體場景權衡。以下是詳細對比和建議&#xff1a;1. multipart/form-data 優點 更適合大文件傳輸&#xff1a; 直接以二進制流傳輸圖片&#xff0c;無需編碼/解碼&am…

如何在 Windows 上安裝 MongoDB 及常見問題

MongoDB 是一款 NoSQL 數據庫&#xff0c;在數據管理和存儲方面以其無與倫比的強大功能和多功能性而脫穎而出。該平臺憑借其靈活性、可擴展性和高性能保持著領先優勢&#xff0c;贏得了眾多企業的信賴。在這方面&#xff0c;MongoDB 以及其在 Windows 操作系統中的表現&#xf…