InitializingBean初始化--Spring容器管理

目錄

  • InitializingBean--自動執行一些初始化操作
  • spring初始化bean有兩種方式:
  • 1.優點
  • 2.缺點
  • 2.@PostConstruct 注解
  • 2.舉例使用InitializingBean接口 和@PostConstruct
  • 3.初始化交給容器管理
  • 4.與main入口函數有什么區別
  • 5.在 Spring 中,有兩種主要的初始化 bean 的方式:
  • 6.使用InitializingBean接口和通過@Component 區別
  • 7.通過注解 @Component 代替 InitializingBean 接口
    • 7.1實現接口 InitializingBean
    • 7.2通過注解 @Component 代替 InitializingBean 接口

InitializingBean–自動執行一些初始化操作

InitializingBean 是 Spring 框架中的一個接口,用于在 Bean 初始化完成后執行特定的操作。它定義了一個方法 afterPropertiesSet(),當 Bean 的屬性設置完成后會被調用。

當一個 Bean 實現了 InitializingBean 接口,并且在配置文件中聲明了該 Bean,Spring 容器會在實例化該 Bean 并設置完屬性后,自動調用 afterPropertiesSet() 方法來執行一些初始化操作。這樣可以避免在配置文件中手動調用初始化方法。

需要注意的是,使用 InitializingBean 接口會將代碼與 Spring 框架緊密耦合在一起,不利于解耦。因此,在實際開發中,更推薦使用 @PostConstruct 注解或者在配置文件中指定 init-method 來定義初始化方法。這樣可以使代碼更加清晰,并且不依賴于特定的框架。
總的來說,InitializingBean 接口就是為了方便在 Spring 框架中自動執行一些初始化操作而設計的。

spring初始化bean有兩種方式:

第一:實現InitializingBean接口,繼而實現afterPropertiesSet的方法
第二:反射原理,配置文件使用init-method標簽直接注入bean

1.優點

InitializingBean 接口的好處在于它提供了一種在 Spring 容器中自動執行初始化操作的機制。以下是使用 InitializingBean 接口的一些好處:

  1. 簡化配置:通過實現 InitializingBean 接口,我們可以將初始化邏輯與對象創建和屬性設置分離。這樣,我們不需要在配置文件或代碼中顯式地調用初始化方法,而是讓 Spring 框架自動處理這部分邏輯。這樣可以減少冗余的配置代碼,使配置更簡潔。

  2. 提高代碼可維護性:通過使用 InitializingBean 接口,我們可以將初始化邏輯集中在一個方法中,使代碼更加清晰和易于維護。此外,由于初始化邏輯位于 Bean 的內部,我們可以更方便地修改和擴展初始化邏輯,而無需修改其他代碼。

  3. 框架集成:Spring 框架本身對 InitializingBean 接口提供了支持,并在適當的時候自動調用 afterPropertiesSet() 方法。這意味著我們可以利用 Spring 的生命周期管理功能,將初始化過程交給框架來處理,而無需手動管理。

盡管 InitializingBean 接口有一些好處,但也需要注意它可能引入的耦合性。因此,在實際開發中,建議使用更加靈活的方式,如使用 @PostConstruct 注解或在配置文件中指定 init-method 來定義初始化方法,以減少對框架的依賴。

2.缺點

使用 InitializingBean 接口的主要缺點是它將代碼與 Spring 框架緊密耦合在一起。這樣可能導致一些問題:

  1. 依賴于 Spring 框架:實現 InitializingBean 接口使得你的類依賴于 Spring 框架,這會限制你的代碼在其他環境中的可移植性。如果你想在非 Spring 環境中使用該類,就需要引入 Spring 相關的依賴。

  2. 缺乏靈活性:InitializingBean 接口只提供了一個方法 afterPropertiesSet(),而且沒有任何參數。這限制了你在初始化過程中的自定義操作。如果你需要更多的靈活性,比如傳遞參數或者執行其他邏輯,可能需要另外的方式來實現初始化。

  3. 命名約束:使用 InitializingBean 接口要求你必須使用固定的方法名 afterPropertiesSet(),這可能與你的代碼風格或命名約定不符。這種限制可能會導致代碼的可讀性和可維護性下降。

總的來說,雖然 InitializingBean 提供了一種簡單的初始化方式,但它的依賴性和約束性可能會限制代碼的可移植性和靈活性。因此,在選擇初始化方式時,需要權衡各種因素并選擇最適合你的需求的方式。

2.@PostConstruct 注解

InitializingBean 接口的功能是在 Bean 創建完成并設置完屬性后執行一些初始化操作。除了實現 InitializingBean 接口外,還可以使用 @PostConstruct 注解來代替。

@PostConstruct 注解是 javax.annotation 包下的注解,通過在方法上添加 @PostConstruct 注解,該方法會在 Bean 初始化完成后自動被調用。它的作用和 InitializingBean 接口的 afterPropertiesSet() 方法類似,用于執行一些初始化邏輯。

因此,只需要在需要執行初始化操作的方法上添加 @PostConstruct 注解,就可以替代實現 InitializingBean 接口的方式。例如:

public class MyBean {@PostConstructpublic void init() {// 初始化操作}
}

在上述代碼中,init() 方法會在 MyBean 對象的創建和屬性設置完成后自動被調用。

2.舉例使用InitializingBean接口 和@PostConstruct

當你使用 InitializingBean 接口時,你需要實現 afterPropertiesSet() 方法,并在其中編寫初始化邏輯。示例如下:

import org.springframework.beans.factory.InitializingBean;public class MyBean implements InitializingBean {private String name;public void setName(String name) {this.name = name;}@Overridepublic void afterPropertiesSet() throws Exception {// 在屬性設置完成后執行初始化邏輯System.out.println("InitializingBean's afterPropertiesSet method: Setting name to " + name);}
}

使用 @PostConstruct 注解時,你只需在需要初始化的方法上添加注解即可,示例如下:

import javax.annotation.PostConstruct;public class MyBean {private String name;public void setName(String name) {this.name = name;}@PostConstructpublic void init() {// 在屬性設置完成后執行初始化邏輯System.out.println("@PostConstruct method: Setting name to " + name);}
}

在這兩個示例中,當容器創建 MyBean 對象并完成屬性設置之后,無論是實現 InitializingBean 接口還是使用 @PostConstruct 注解,都會在相應的初始化方法中設置屬性值并輸出相應的信息。

3.初始化交給容器管理

是的,通過實現 InitializingBean 接口或使用 @PostConstruct 注解,你可以將初始化過程交給容器管理。初始化過程中的邏輯會在容器創建對象并完成屬性設置之后自動執行。

這樣做的好處是:

  1. 簡化配置:你無需手動在代碼中調用初始化方法,而是通過容器自動觸發。這減少了手動編寫初始化代碼的工作量,并且使配置更加簡潔。

  2. 依賴注入完畢后進行初始化:在初始化過程中,你可以確保所有依賴屬性已經注入完成。這樣可以避免在尚未完成依賴注入時執行初始化邏輯導致的錯誤。

  3. 解耦合:將初始化邏輯交給容器管理,使得你的類與 Spring 框架解耦,提高了代碼的可移植性和可測試性。

總的來說,將初始化過程交給容器管理可以簡化代碼配置,確保初始化在依賴注入之后進行,并降低代碼與框架的耦合度。這是一種常見的實踐方式,可以提高代碼的可維護性和可擴展性。

4.與main入口函數有什么區別

使用 InitializingBean 接口或 @PostConstruct 注解與在 main 函數中手動進行初始化相比,有以下幾點區別:

  1. 自動觸發 vs 手動調用:使用 InitializingBean 接口或 @PostConstruct 注解時,初始化邏輯會在對象創建完成后自動觸發,而不需要手動調用初始化方法。這樣可以確保在合適的時機執行初始化邏輯,并且避免了手動調用帶來的疏漏或錯誤。

  2. 框架管理 vs 手動管理:通過使用 InitializingBean 接口或 @PostConstruct 注解,你將初始化過程交給了 Spring 容器管理。容器負責創建對象、注入依賴和執行初始化邏輯等工作。而在 main 函數中手動進行初始化,則需要開發者自行管理對象的生命周期,包括創建對象、注入依賴、執行初始化等。

  3. 依賴注入保證 vs 手動處理:使用 Spring 的初始化方式,你可以確保在初始化過程中,所有依賴的屬性已經完成注入。Spring 容器會在合適的時機完成屬性注入,而你無需關心依賴的創建和注入過程。而在 main 函數中手動進行初始化,則需要開發者手動管理依賴的創建和注入。

總之,使用 InitializingBean 接口或 @PostConstruct 注解能夠更好地利用 Spring 框架的特性,簡化配置,提高代碼的可維護性和可測試性。與在 main 函數中手動進行初始化相比,它們能夠減少手動調用的復雜性,并與 Spring 容器緊密集成,從而提供更強大的依賴注入和生命周期管理功能。

5.在 Spring 中,有兩種主要的初始化 bean 的方式:

在 Spring 中,有兩種主要的初始化 bean 的方式:

  1. 默認構造函數初始化:Spring 使用默認的無參構造函數創建對象,并通過調用對象的 setter 方法或直接訪問字段來設置屬性。這是最常見的初始化 bean 的方式。

示例代碼:

public class MyBean {private String name;public MyBean() {// 默認構造函數}public void setName(String name) {this.name = name;}// 其他屬性的 setter 和 getter 方法// 其他業務方法
}
  1. 配置文件初始化:通過在 XML 或注解配置文件中顯式聲明 bean,并提供屬性值或引用其他 bean 來進行初始化。

XML 配置示例:

<bean id="myBean" class="com.example.MyBean"><property name="name" value="John Doe" /><!-- 其他屬性的設置 -->
</bean>

注解配置示例:

@Component
public class MyBean {private String name;@Value("John Doe")public void setName(String name) {this.name = name;}// 其他屬性的 setter 和 getter 方法// 其他業務方法
}

這兩種初始化方式可以單獨使用,也可以結合使用。一般來說,通過默認構造函數初始化 bean 是最常見和簡單的方式,而通過配置文件初始化則提供了更靈活的配置選項

6.使用InitializingBean接口和通過@Component 區別

InitializingBean 接口和 @Component 注解都是用來在 Spring 中初始化 bean 的方式,但它們有一些區別。

  1. InitializingBean 接口:
    InitializingBean 是一個 Spring 提供的接口,當一個 bean 實現了該接口時,Spring 容器會在 bean 初始化完成后自動調用 afterPropertiesSet() 方法,從而執行自定義的初始化邏輯。通過實現這個接口,你可以在初始化階段執行一些特定的操作,比如檢查依賴關系、初始化資源等。

示例代碼:

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;@Component
public class MyBean implements InitializingBean {private String name;public void setName(String name) {this.name = name;}// 其他屬性的 setter 和 getter 方法// 其他業務方法@Overridepublic void afterPropertiesSet() throws Exception {// 在初始化完成后執行的邏輯}
}
  1. @Component 注解:
    @Component 是 Spring 提供的注解之一,用于表示一個類是一個組件(bean)。當你在一個類上添加 @Component 注解時,Spring 容器會自動將其實例化并進行管理,包括初始化和依賴注入等。你可以通過在 @Component 注解中指定 bean 的名稱或使用默認的名稱來命名 bean。

示例代碼:

import org.springframework.stereotype.Component;@Component  // 或者 @Component("myBean")
public class MyBean {private String name;public void setName(String name) {this.name = name;}// 其他屬性的 setter 和 getter 方法// 其他業務方法
}

區別:

  • InitializingBean 接口提供了更細粒度的控制,你可以在 afterPropertiesSet() 方法中編寫自定義的初始化邏輯。然而,這種方式使你的代碼與 Spring 緊密耦合,不夠靈活。
  • @Component 注解是一種更簡單和常用的方式,通過添加注解,你可以將一個類聲明為 bean,并由 Spring 容器自動進行初始化和管理。它提供了更大的靈活性,允許你使用其他注解、配置文件等來定制 bean 的行為。

綜上所述,InitializingBean 接口適用于需要在初始化階段執行特定操作的場景,而 @Component 注解適用于普通的 bean 初始化和管理。

7.通過注解 @Component 代替 InitializingBean 接口

7.1實現接口 InitializingBean

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;public class MyBean implements InitializingBean {private String name;public void setName(String name) {this.name = name;}// 其他屬性的 setter 和 getter 方法// 其他業務方法@Overridepublic void afterPropertiesSet() throws Exception {// 在初始化完成后執行的邏輯}
}

7.2通過注解 @Component 代替 InitializingBean 接口

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;@Component
public class MyBean {private String name;public void setName(String name) {this.name = name;}// 其他屬性的 setter 和 getter 方法// 其他業務方法@PostConstructpublic void init() {// 在屬性設置完成后執行初始化邏輯System.out.println("@PostConstruct method: Setting name to " + name);}
}

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

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

相關文章

【Java SE】帶你識別什么叫做異常!!!

&#x1f339;&#x1f339;&#x1f339;個人主頁&#x1f339;&#x1f339;&#x1f339; 【&#x1f339;&#x1f339;&#x1f339;Java SE 專欄&#x1f339;&#x1f339;&#x1f339;】 &#x1f339;&#x1f339;&#x1f339;上一篇文章&#xff1a;【Java SE】帶…

Android獲取Wifi網關

公司有這樣一個應用場景&#xff1a;有一臺球機設備&#xff0c;是Android系統的&#xff0c;它不像手機&#xff0c;它沒有觸摸屏幕&#xff0c;所以我們對球機的操作很不方便&#xff0c;于是我們搞這樣一個設置&#xff1a;點擊球機電源鍵5次分享出一個熱點&#xff0c;然后…

【JVM從入門到實戰】(一) 字節碼文件

一、什么是JVM JVM 全稱是 Java Virtual Machine&#xff0c;中文譯名 Java虛擬機。 JVM 本質上是一個運行在計算機上的程序&#xff0c;他的職責是運行Java字節碼文件。 二、JVM的功能 解釋和運行 對字節碼文件中的指令&#xff0c;實時的解釋成機器碼&#xff0c;讓計算機…

C++類模板不是一開始就創建的,而是調用時生成

類模板中的成員函數和普通類中成員函數創建時機有區別的&#xff1a; 普通類中的成員函數一開始就可以創建模板類中的成員函數調用的時候才可以創建 總結;類模板中的成員函數并不是一開始就創建的&#xff0c;再調用時才去創建 #include<iostream> using namespace st…

微信小程序:模態框(彈窗)的實現

效果 wxml <!--新增&#xff08;點擊按鈕&#xff09;--> <image classimg src"{{add}}" bindtapadd_mode></image> <!-- 彈窗 --> <view class"modal" wx:if"{{showModal}}"><view class"modal-conten…

Vue中$props、$attrs和$listeners的使用詳解

文章目錄 透傳屬性如何禁止“透傳屬性和事件”多根節點設置透傳訪問“透傳屬性和事件” $props、$attrs和$listeners的使用詳解 透傳屬性 透傳屬性和事件并沒有在子組件中用props和emits聲明透傳屬性和事件最常見的如click和class、id、style當子組件只有一個根元素時&#xf…

jOOQ指南中使用的數據庫

jOOQ指南中使用的數據庫 本指南中使用的數據庫將在本節中進行總結和創建 使用Oracle方言來創建 # 創建語言 CREATE TABLE language (id NUMBER(7) NOT NULL PRIMARY KEY,cd CHAR(2) NOT NULL,description VARCHAR2(50) );# 創建作者 CREATE TABLE author (id NUMBER(7) NOT …

mysql:需要準確存儲的帶小數的數據,要使用DECIMAL類型

需要準確存儲的帶小數的數據&#xff0c;要使用DECIMAL&#xff0c;特別是涉及金錢類的業務。而不要使用FLOAT或者DOUBLE。 因為DECIMAL是準確值&#xff0c;不會損失精度。 而FLOAT或者DOUBLE是近似值&#xff0c;會損失精度。 https://dev.mysql.com/doc/refman/8.2/en/fixe…

差生文具多系列之最好看的編程字體

&#x1f4e2;?聲明&#xff1a; &#x1f344; 大家好&#xff0c;我是風箏 &#x1f30d; 作者主頁&#xff1a;【古時的風箏CSDN主頁】。 ?? 本文目的為個人學習記錄及知識分享。如果有什么不正確、不嚴謹的地方請及時指正&#xff0c;不勝感激。 直達博主&#xff1a;「…

數據結構 | Floyd

參考博文&#xff1a; floyd算法 弗洛伊德算法 多源最短路徑算法_弗洛伊德算法例題-CSDN博客

【文心一言】AI試用寫代碼體會:delphi、php

一、前言&#xff1a; 二、讓【文心一言】編寫一個函數 1. Delphi 語言&#xff08;文心一言的回復&#xff09; 2. php 語言&#xff08;文心一言回復&#xff09; 三、總結 一、前言&#xff1a; 眾所周知&#xff0c;chatGPT是可以自動編寫程序的&#xff0c;甚至可以運…

MyBatis緩存機制流程分析

前言 在進行分析之前&#xff0c;建議快速瀏覽之前寫的理解MyBatis原理、思想&#xff0c;這樣更容易閱讀、理解本篇內容。 驗證一級緩存 MyBatis的緩存有兩級&#xff0c;一級緩存默認開啟&#xff0c;二級緩存需要手動開啟。 重復讀取跑緩存 可以看到&#xff0c;第二次…

OpenAI承認GPT-4變懶,即將發布修復方案提升性能

目錄 1OpenAI承認GPT-4變懶&#xff0c;即將發布修復方案提升性能 2一文秒懂人工智能全球近況 1OpenAI承認GPT-4變懶&#xff0c;即將發布修復方案提升性能 **劃重點:** 1. &#x1f92f; 用戶反饋:GPT-4使用者抱怨OpenAI破壞了體驗&#xff0c;稱模型幾乎“害怕”提供答案。…

Wireshark使用技巧

Wireshark作為網絡數據軟件&#xff0c;功能強大&#xff0c;本專欄介紹僅為冰山一角&#xff0c;僅僅是一個入門級別的介紹&#xff0c;大部分功能還需要在日常工作中進行挖掘。 總結Wireshark軟件的使用技巧如下&#xff1a; 1.合理部署Wireshark的位置&#xff0c;從源頭保障…

基于Java SSM框架實現電影售票系統項目【項目源碼+論文說明】

基于java的SSM框架實現電影售票系統演示 摘要 21世紀的今天&#xff0c;隨著社會的不斷發展與進步&#xff0c;人們對于信息科學化的認識&#xff0c;已由低層次向高層次發展&#xff0c;由原來的感性認識向理性認識提高&#xff0c;管理工作的重要性已逐漸被人們所認識&#…

界面控件DevExpress WPF導航組件,助力升級應用程序用戶體驗!(下)

DevExpress WPF的Side Navigation&#xff08;側邊導航&#xff09;、TreeView、導航面板組件能幫助開發者在WPF項目中添加Windows樣式的資源管理器欄或Outlook NavBar&#xff08;導航欄&#xff09;&#xff0c;DevExpress WPF NavBar和Accordion控件包含了許多開發人員友好的…

rsyslog配置以及原理

rsyslog 日志由程序產生&#xff0c;在內存中產生。通過Rsyslog來將內存中程序產生的日志持久化到硬盤&#xff0c;并且支持udp、tcp等協議來進行不同服務器的日志同步。 /var/log/messages:大多數系統日志信息紀錄在此/var/log/secure&#xff1a;安全和身份認證相關的消息和…

HTTP詳解

1. web 1.1 web相關概念 軟件架構 C /S&#xff1a;客戶端/服務器端 需要安裝客戶端應用 B/S&#xff1a;瀏覽器/服務器端 不需要安裝客戶端應用&#xff0c;對于用戶來說只需要記住域名訪問就可以,高效,客戶端零維護 資源分類 靜態資源&#xff1a;所有用戶訪問后&#x…

數據庫系統原理與實踐 筆記 #12

文章目錄 數據庫系統原理與實踐 筆記 #12事務管理和并發控制與恢復(續)并發控制SQL-92中的并發級別基于鎖的協議基于鎖的協議的隱患鎖的授予封鎖協議兩階段封鎖協議多粒度粒度層次的例子意向鎖類型相容性矩陣多粒度封鎖模式基于時間戳的協議基于時間戳協議的正確性基于有效性檢…