了解Spring中Bean:配置與作用域

在這里插入圖片描述

作為一名對技術充滿熱情的學習者,我一直以來都深刻地體會到知識的廣度和深度。在這個不斷演變的數字時代,我遠非專家,而是一位不斷追求進步的旅行者。通過這篇博客,我想分享我在某個領域的學習經驗,與大家共同探討、共同成長。請大家以開放的心態閱讀,相信你們也會在這段知識之旅中找到啟示。

文章目錄

  • 前言
  • 一、什么是Bean?
  • 二、Bean的配置
      • 常用屬性:
      • 常用子元素:
  • 三、Bean的作用域
  • 四、singleton和prototype作用域
      • 單例(singleton)作用域
      • 原型(prototype)作用域


前言

Spring如同一個工廠,用于管理Spring中的Bean。使用這個工廠我們需要對SPring的文件進行配置,采用XML文件的形式進行對Bean的講解。下面我們就開始學習吧。


一、什么是Bean?

在Spring框架中,bean是指一個由Spring IoC容器實例化、組裝和管理的對象。可以理解為是由Spring容器生成和控制生命周期的一個對象實例。Spring中的bean通常是普通的Java對象(POJOs),可以通過配置文件或者注解的方式來聲明和配置。

Spring IoC容器負責創建bean,以及根據配置來注入依賴對象,這個過程通常稱為依賴注入(Dependency Injection, DI)。依賴注入允許你的應用程序的不同部分松耦合,易于維護和測試。

Bean的作用范圍和生命周期由Spring容器進行管理。根據配置,Spring可以為每次請求創建新的bean,也可以返回單例的bean,或是其他的作用域。

在Spring中定義bean有幾種方式:

  1. XML配置文件 - 通過在XML中使用<bean>標簽定義一個bean及其屬性。

  2. 注解 - 使用注解(如@Component, @Service, @Repository, @Controller等)標注類,Spring掃描這些注解自動注冊bean。

  3. Java配置類 - 使用@Configuration注解的類定義beans和注入依賴,可以使用@Bean注解在方法上返回對象的實例。

這些beans是構成你的應用的基礎,可以用來創建服務層、數據訪問層和其他業務邏輯。通過Spring框架的強大功能和輕量級容器支持,應用的配置和管理變得更加容易和靈活。

二、Bean的配置

在Spring的XML配置中,<bean>元素是用來定義一個bean的配置說明。它有若干屬性和子元素,這些都用來精細地控制bean的創建和行為。

常用屬性:

  1. id: 唯一標識一個bean的名稱,可以用來在其他地方引用這個bean。
  2. class: bean實例對應的全限定類名(包含包名和類名)。
  3. scope: 定義bean的作用域,如singleton(單例,默認值),prototype(多例),request,session等。
  4. constructor-arg: 用來通過構造函數注入依賴。
  5. property: 用來通過Setter方法注入依賴。
  6. lazy-init: 是否延遲初始化bean,只有在真正使用到時才創建bean實例,默認值是false。
  7. autowire: 自動裝配模式,默認值是no,其他值包括byName,byType,constructor,autodetect。

常用子元素:

  1. constructor-arg: 定義傳遞給bean構造方法的參數。這個子元素可以包含<value><ref><idref>等元素來指定參數值。
  2. property: 定義通過setter方法注入到bean的屬性。這個子元素同樣可以包括<value><ref><idref>等元素。
  3. qualifier: 與autowire屬性配合使用,指定自動裝配時需要考慮的限定符。
  4. lookup-method: 用于獲取動態地返回bean實例的方法。
  5. replaced-method: 用于在運行時替換方法邏輯的配置。

<bean>的簡單XML配置示例,說明了如何使用這些元素和屬性:

<beans><!-- 定義一個單例的bean --><bean id="myBean" class="com.example.MyClass" scope="singleton"><!-- 通過構造器注入,引用了另一個名為 myDependency 的bean --><constructor-arg ref="myDependency"/><!-- 設置屬性,直接使用值 --><property name="exampleProperty" value="Hello World"/><!-- 延遲初始化 --><property name="lazyInit" value="true"/><!-- 設置屬性,引用了另一個bean --><property name="anotherBean" ref="myOtherBean"/></bean><!-- 定義依賴項 --><bean id="myDependency" class="com.example.MyDependency"/><bean id="myOtherBean" class="com.example.MyOtherClass"/>
</beans>

在這個例子中,myBean是一個單例的bean,它有一個通過構造器注入依賴的myDependency,還有兩個屬性:examplePropertyanotherBean。其中lazy-init被設置為true,意味著myBean將在首次請求時初始化。其他定義的bean參考了這個bean需要的依賴。

三、Bean的作用域

在Spring框架中,bean的作用域定義了bean實例的生命周期和可見性。不同的作用域可以應用于不同的情景,以下是Spring支持的幾種主要的作用域:

  1. singleton:單例作用域是Spring中默認的作用域。對于在單例作用域中定義的每個bean,Spring IoC容器只會創建一個共享的bean實例,并且所有的請求都返回同一個bean實例。這適用于無狀態的bean。

  2. prototype:原型作用域會讓每次請求都創建一個新的bean實例,即每次調用Spring容器的getBean()方法時,都會返回一個全新的對象,適用于所有的狀態都是非共享的bean。

  3. request:在Web應用中,對每個HTTP請求都可以創建一個bean實例,該作用域僅在基于web的Spring ApplicationContext中有效。

  4. session:在Web應用中,對每個HTTP會話都可以創建一個bean實例,該作用域也僅在基于web的Spring ApplicationContext中有效。

  5. application:在Web應用中,對每個ServletContext都創建一個bean實例,該作用域也僅在基于web的Spring ApplicationContext中有效。

  6. websocket:在WebSocket應用中,對每個WebSocket會話都創建一個bean實例,也僅在基于web的Spring ApplicationContext中有效。

選擇正確的作用域對于管理應用程序中bean的生命周期是非常重要的,特別是在涉及到線程安全和資源管理的時候。例如,一個具有狀態(stateful)的對象不應該被聲明為單例,因為它在多個請求之間不能共享。而原型作用域適用于所有狀態都是獨立的情況下。

在配置文件或注解中定義bean作用域(如使用@Scope注解)時,可以根據需要選擇上述作用域中的任一個。

四、singleton和prototype作用域

單例(singleton)作用域

單例作用域是Spring默認的作用域,確保在Spring IoC容器中只為每個Spring Bean定義創建一個實例。無論你多少次請求同一個Spring Bean,都將接收同一個實例,即該特定bean的唯一實例。單例作用域最適用于無狀態的服務,例如配置服務或數據庫服務。

示例代碼(XML配置):

<bean id="singletonService" class="com.example.SingletonService" scope="singleton"/>

示例代碼(注解):

@Component
@Scope("singleton")
public class SingletonService {// 類成員和方法
}

在這個例子中,SingletonService類是以單例的方式在Spring容器中注冊的。無論你何時通過容器獲取singletonService,它總是返回同一個實例。

原型(prototype)作用域

原型作用域將導致Spring容器為每次請求都創建一個新的bean實例。換句話說,每次調用Spring容器的getBean()方法時,它都會創建一個新的對象實例。原型作用域適合那些定義狀態的對象,這些對象不應該被不同的依賴關系共享。

示例代碼(XML配置):

<bean id="prototypeService" class="com.example.PrototypeService" scope="prototype"/>

示例代碼(注解):

@Component
@Scope("prototype")
public class PrototypeService {// 類成員和方法
}

在這個例子中,每當從Spring容器請求PrototypeService時,就會創建一個新的PrototypeService實例。

在開發使用Spring框架的應用程序時,理解并正確使用這些作用域非常關鍵,因為它們對應用程序的性能和行為有顯著影響。單例作用域用于共享不變的共享資源,而原型作用域用于每個使用時都有不同狀態的場景。

感謝大家抽出寶貴的時間來閱讀博主的博客,新人博主,感謝大家關注點贊,祝大家未來的學習工作生活一帆風順,加油!!!
在這里插入圖片描述

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

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

相關文章

遞歸回溯剪枝-括號生成

LCR 085. 括號生成 - 力扣&#xff08;LeetCode&#xff09; 一. 根據題意&#xff0c;分析出符合要求的括號組合需要滿足以下兩個條件&#xff1a; 1. 左括號數或者右括號數都不能超過 n&#xff1b; 2. 從最左側開始的每一個子集&#xff0c;不可以出現右括號數大于左括號數&…

CF 1934B

冗長的代碼&#xff08;枚舉解法&#xff09; #include<bits/stdc.h>using namespace std;void solve() {int n;cin>>n;if(n1||n3||n6||n10||n15){cout<<1<<endl;return;}int cnt0;if(n>100){int tempn/15;if(temp>6){n-(temp-6)*15;cnttemp-6;…

算法復習之前綴和【備戰藍橋杯】

一維前綴和 S[i] a[1] a[2] ... a[i] a[l] ... a[r] S[r] - S[l - 1]二維前綴和 S[i, j] 第i行j列格子左上部分所有元素的和 以(x1, y1)為左上角&#xff0c;(x2, y2)為右下角的子矩陣的和為&#xff1a; S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] S[x1 - 1, y1 - …

中國電子學會(CEIT)2020年06月真題C語言軟件編程等級考試四級(含詳細解析答案)

中國電子學會&#xff08;CEIT&#xff09;考評中心歷屆真題&#xff08;含詳細解析答案&#xff09; C語言軟件編程等級考試四級 2020年06月 編程題四道 總分:100分一、最長上升子序列&#xff08;25分&#xff09; 一個數的序列bi&#xff0c;當b1 < b2< … &l…

長期可用的文件二維碼怎么做?在線制作可修改的文件活碼

怎么做一個可以長期使用的文件二維碼呢&#xff1f;現在通過二維碼來傳遞文件是很流行的一種方式&#xff0c;將文件生成二維碼后印刷上墻或者分享給他人都可以快速完成文件的傳播&#xff0c;所以在下發通知、資料等方面用途較多。那么文件二維碼該如何生成呢&#xff1f; 想…

Linux內存地址空間

目錄 一、虛擬地址空間 1.虛擬地址空間的定義 2.虛擬地址空間的布局 二、內存壁壘 1.內存壁壘的定義?編輯 2.段錯誤 三、內存映射的建立與解除 &#xff08;1&#xff09;mmap &#xff08;2&#xff09;munmap &#xff08;3&#xff09;堆內存的分配和釋放 1.sbrk …

Android13 設置固定熱點ip地址192.168.43.1

Android13 設置固定熱點ip地址192.168.43.1 文章目錄 Android13 設置固定熱點ip地址192.168.43.1一、前言二、設置固定ip地址實現1、Android13 代碼中的實現&#xff1a;添加屬性寫法&#xff1a; 2、Android11 或者更舊的代碼中的實現&#xff1a; 三、其他1、Android 代碼獲連…

Python中學習調試requests模塊時出現的大坑(1)

為防止迷路: 學習機械相關,請關注公眾號:南大盛聯 學習軟件,硬件,請關注公眾號號:一訓微課 cmd模式下 不知道上面這行的話,需要補課。 pip install requests 這個不知道的話,也要補課 pip是python的安裝工具。 install是安裝的意思 requests是我們需要安裝的模…

HTML超鏈接去下劃線

當在HTML中創建超鏈接時&#xff0c;默認情況下會顯示為帶有下劃線的藍色文本。如果想要去掉下劃線&#xff0c;可以使用CSS樣式來實現。 示例代碼&#xff1a; <!DOCTYPE html> <html> <head> <style> a {text-decoration: none;color: blue; /* 設…

微信小程序 --- 事件處理

事件處理 一個應用僅僅只有界面展示是不夠的&#xff0c;還需要和用戶做交互&#xff0c;例如&#xff1a;響應用戶的點擊、獲取用戶輸入的值等等&#xff0c;在小程序里邊&#xff0c;我們就通過編寫 JS 腳本文件來處理用戶的操作 1. 事件綁定和事件對象 小程序中綁定事件與…

sora會是AGI的拐點么?

©作者|謝國斌 來源|神州問學 OpenAI近期發布的Sora是一個文本到視頻的生成模型。這項技術可以根據用戶輸入的描述性提示生成視頻&#xff0c;延伸現有視頻的時間&#xff0c;以及從靜態圖像生成視頻。Sora可以創建長達一分鐘的高質量視頻&#xff0c;展示出對用戶提示的精…

PoC免寫攻略

在網絡安全領域&#xff0c;PoC&#xff08;Proof of Concept&#xff09;起著重要的作用&#xff0c;并且在安全研究、漏洞發現和漏洞利用等方面具有重要的地位。攻擊方視角下&#xff0c;常常需要圍繞 PoC 做的大量的工作。常常需要從手動測試開始編寫 PoC&#xff0c;再到實…

vue項目電商

這個項目功能有首頁&#xff0c;分類&#xff0c;商品詳情&#xff0c;購物車&#xff0c;用戶注冊、登錄等等的實現&#xff0c;并且可以在手機上進行展示。 git倉庫地址&#xff1a;https://gitee.com/BisShen/project.git

應用層http協議包解析與https加密策略解析

文章目錄 一.應用層協議--http協議基礎認知二.https協議加密策略解析加密策略1--通信雙方只使用對稱加密加密策略2--通信雙方使用單方非對稱加密加密策略3--通信雙方都使用非對稱加密加密策略4--非對稱加密與對稱加密配合使用中間人攻擊數據簽名與CA證書HTTPS數據安全認證的本質…

二維碼門樓牌管理系統技術服務的分類與應用

文章目錄 前言一、二維碼門樓牌管理系統的分類二、二維碼門樓牌管理系統的應用優勢三、結論 前言 隨著城市管理的精細化和智能化&#xff0c;二維碼門樓牌管理系統成為了現代城市管理的重要工具。該系統將傳統的門牌、樓牌、戶牌與二維碼技術相結合&#xff0c;實現了信息的快…

如何優化一個運行緩慢的SQL查詢?有哪些常見的優化技巧?

如何優化一個運行緩慢的SQL查詢&#xff1f; 當面對一個運行緩慢的SQL查詢時&#xff0c;優化是提升數據庫性能的關鍵步驟。優化查詢不僅可以減少查詢執行時間&#xff0c;還可以降低系統資源消耗&#xff0c;提高整體的系統吞吐量。以下將詳細探討如何優化一個運行緩慢的SQL查…

MySQL:常用的SQL語句

提醒&#xff1a;設定下面的語句是在數據庫名為 db_book執行的。 一、創建表 1. 創建t_booktype表 USE db_book; CREATE TABLE t_booktype(id INT AUTO_INCREMENT, bookTypeName VARCHAR(20),bookTypeDesc varchar(200),PRIMARY KEY (id) );2. 創建t_book表 USE db_book; C…

[筆記] wsl 禁用配置 win系統環境變量+代理

wsl 配置禁用 win系統環境變量 進入 wsl 的 /etc/wsl.conf 目錄&#xff0c;增加以下配置&#xff1a; [interop] enabledfalse appendWindowsPathfalse然后退出wsl&#xff0c;并且執行關閉正在運行的 wsl&#xff0c;執行命令 wsl --shutdown 最后重新進入wsl 即可。 參考…

C語言-----動態內存管理(1)

1.引入 我們之前已經學習了幾種開辟內存空間的方式&#xff1a; &#xff08;1&#xff09;int a10;開辟4個字節大小的空間 &#xff08;2&#xff09;int arr[10]{0}定義數組開辟了一串連續的空間 2.malloc和free (1)malloc開辟內存空間可能會失敗&#xff0c;因此需要檢查…

HTML5+CSS3+JS小實例:文字陰影還能這么玩

實例:文字陰影還能這么玩 技術棧:HTML+CSS+JS 效果: 源碼: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge"…