Spring 中 Bean 的生命周期

来源:https://www.cnblogs.com/xiaowange/archive/2023/09/10/17692151.html
-Advertisement-
Play Games

在您的應用程式中,由Spring IoC容器管理的形成其核心的對象被稱為"bean"。一個bean是由Spring IoC容器實例化、組裝和管理的對象。這些bean是通過您提供給容器的配置元數據創建的,例如,在前面章節中已經看到的XML <bean/> 定義。 Bean定義包含了所謂的配置元數據,容 ...


在您的應用程式中,由Spring IoC容器管理的形成其核心的對象被稱為"bean"。一個bean是由Spring IoC容器實例化、組裝和管理的對象。這些bean是通過您提供給容器的配置元數據創建的,例如,在前面章節中已經看到的XML <bean/> 定義。

Bean定義包含了所謂的配置元數據,容器需要瞭解以下內容:

  • 如何創建一個bean
  • Bean的生命周期詳細信息
  • Bean的依賴關係

上述所有的配置元數據都轉化為每個bean定義的以下屬性集合。

序號 屬性和描述
1 class
這是必填屬性,指定要用於創建bean的bean類。
2 name
此屬性唯一地指定bean標識符。在基於XML的配置元數據中,您可以使用id和/或name屬性來指定bean標識符。
3 scope
此屬性指定從特定bean定義創建的對象的範圍,將在bean範圍章節中討論。
4 constructor-arg
這用於註入依賴項,將在後續章節中討論。
5 properties
這用於註入依賴項,將在後續章節中討論。
6 autowiring mode
這用於註入依賴項,將在後續章節中討論。
7 lazy-initialization mode
延遲初始化的bean告訴IoC容器在首次請求時創建bean實例,而不是在啟動時創建。
8 initialization method
在容器設置了bean的所有必需屬性之後,要調用的回調函數。將在bean生命周期章節中討論。
9 destruction method
在包含bean的容器銷毀時要使用的回調函數。將在bean生命周期章節中討論。

Spring配置元數據

Spring IoC容器與實際編寫配置元數據的格式完全解耦。以下是向Spring容器提供配置元數據的三種重要方法:

  • 基於XML的配置文件。
  • 基於註解的配置。
  • 基於Java的配置。

您已經看到瞭如何將基於XML的配置元數據提供給容器,但讓我們看一下包含不同bean定義的XML配置文件的另一個示例,包括延遲初始化、初始化方法和銷毀方法。

<?xml version = "1.0" encoding = "UTF-8"?>

<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <!-- 一個簡單的bean定義 -->
   <bean id = "..." class = "...">
      <!-- 此處是該bean的協作者和配置 -->
   </bean>

   <!-- 啟用延遲初始化的bean定義 -->
   <bean id = "..." class = "..." lazy-init = "true">
      <!-- 此處是該bean的協作者和配置 -->
   </bean>

   <!-- 具有初始化方法的bean定義 -->
   <bean id = "..." class = "..." init-method = "...">
      <!-- 此處是該bean的協作者和配置 -->
   </bean>

   <!-- 具有銷毀方法的bean定義 -->
   <bean id = "..." class = "..." destroy-method = "...">
      <!-- 此處是該bean的協作者和配置 -->
   </bean>

   <!-- 更多的bean定義在此處 -->

Spring中的Bean作用域

在定義<bean>時,您可以選擇為該bean聲明一個作用域。例如,要強制Spring每次需要時生成新的bean實例,您應該將bean的作用域屬性聲明為prototype。類似地,如果您希望Spring每次需要時返回相同的bean實例,您應該將bean的作用域屬性聲明為singleton。

Spring Framework支持以下五種作用域,其中三種僅在使用與Web相關的ApplicationContext時才可用。

序號 作用域 & 描述
1 singleton
將bean定義的作用域限製為Spring IoC容器中的單個實例(預設)。
2 prototype
將單個bean定義的作用域限製為具有任意數量的對象實例。
3 request
將bean定義的作用域限製為HTTP請求。僅在具有與Web相關的Spring ApplicationContext的情況下有效。
4 session
將bean定義的作用域限製為HTTP會話。僅在具有與Web相關的Spring ApplicationContext的情況下有效。
5 global-session
將bean定義的作用域限製為全局HTTP會話。僅在具有與Web相關的Spring ApplicationContext的情況下有效。

在本章中,我們將討論前兩種作用域,當討論與Web相關的Spring ApplicationContext時,將討論其他三種作用域。

單例作用域(singleton)

如果將作用域設置為singleton,Spring IoC容器將創建一個對象的確切實例,該實例由bean定義定義。此單個實例存儲在此類單例bean的緩存中,對於該命名bean的所有後續請求和引用都會返回緩存的對象。

預設作用域始終是singleton。但是,當您需要一個且僅一個bean實例時,您可以在bean配置文件中將作用域屬性設置為singleton,如下所示:

<!-- 具有singleton作用域的bean定義 -->
<bean id="..." class="..." scope="singleton">
   <!-- 此處放置此bean的協作者和配置 -->

示例

假設您已經準備好Eclipse IDE,並採取以下步驟創建Spring應用程式:

步驟 描述 1 創建一個名為SpringExample的項目,在創建的項目中的src文件夾下創建一個名為com.tutorialspoint的包。 2 使用"Add External JARs"選項添加所需的Spring庫,如Spring Hello World示例章節中所述。 3 在com.tutorialspoint包下創建Java類HelloWorld和MainApp。 4 在src文件夾下創建Beans配置文件Beans.xml。 5 最後一步是創建所有Java文件和Bean配置文件的內容,並按以下說明運行應用程式。

以下是HelloWorld.java文件的內容:

package com.tutorialspoint;

public class HelloWorld {
   private String message;

   public void setMessage(String message){
      this.message  = message;
   }
   public void getMessage(){
      System.out.println("Your Message : " + message);
   }
}

以下是MainApp.java文件的內容:

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      HelloWorld objA = (HelloWorld) context.getBean("helloWorld");

      objA.setMessage("I'm object A");
      objA.getMessage();

      HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
      objB.getMessage();
   }
}

以下是singleton作用域所需的Beans.xml配置文件的內容:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="helloWorld" class="com.tutorialspoint.HelloWorld" scope="singleton">
   </bean>

</beans>

當您完成創建源代碼和bean配置文件後,讓我們運行應用程式。如果您的應用程式一切正常,它將列印以下消息:

Your Message : I'm object A
Your Message : I'm object A

原型作用域(prototype)

如果將作用域設置為prototype,Spring IoC容器將在每次請求特定bean時創建該對象的新bean實例。通常,對於所有有狀態的bean,使用prototype作用域,對於無狀態的bean,使用singleton作用域。

要定義原型作用域,您可以在bean配置文件中將作用域屬性設置為prototype,如下所示:

<!-- 具有prototype作用域的bean定義 -->
<bean id="..." class="..." scope="prototype">
   <!-- 此處放置此bean的協作者和配置 -->
</bean>

示例

假設您已經準備好Eclipse IDE,並採取以下步驟創建Spring應用程式:

步驟 描述 1 創建一個名為SpringExample的項目,在創建的項目中的src文件夾下創建一個名為com.tutorialspoint的包。 2 使用"Add External JARs"選項添加所需的Spring庫,如Spring Hello World示例章節中所述。 3 在com.tutorialspoint包下創建Java類HelloWorld和MainApp。 4 在src文件夾下創建Beans配置文件Beans.xml。 5 最後一步是創建所有Java文件和Bean配置文件的內容,並按以下說明運行應用程式。

以下是HelloWorld.java文件的內容:

package com.tutorialspoint;

public class HelloWorld {
   private String message;

   public void setMessage(String message){
      this.message  = message;
   }
   public void getMessage(){
      System.out.println("Your Message : " + message);
   }
}

以下是MainApp.java文件的內容

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      HelloWorld objA = (HelloWorld) context.getBean("helloWorld");

      objA.setMessage("I'm object A");
      objA.getMessage();

      HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
      objB.getMessage();
   }
}

以下是prototype作用域所需的Beans.xml配置文件的內容:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="helloWorld" class="com.tutorialspoint.HelloWorld" scope="prototype">
   </bean>

</beans>

當您完成創建源代碼和bean配置文件後,讓我們運行應用程式。如果您的應用程式一切正常,它將列印以下消息:

Your Message : I'm object A
Your Message : null

最後

為了方便其他設備和平臺的小伙伴觀看往期文章,鏈接奉上:

公眾號搜索Let us Coding知乎開源中國CSDN思否掘金InfoQ簡書博客園慕課51CTOhelloworld騰訊開發者社區阿裡開發者社區

看完如果覺得有幫助,歡迎點贊、收藏關註


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 下麵的系列文章記錄瞭如何使用一塊linux開發扳和一塊OLED屏幕實現視頻的播放: 項目介紹 為OLED屏幕開發I2C驅動 使用cuda編程加速視頻處理 這是此系列文章的第2篇, 主要總結和記錄一個I2C從設備的驅動, 在linux內核中如何實現, 如何給用戶態的程式暴露合適的介面, 讓用戶態有機會 ...
  • 1. 除非遇到異常情況,否則不需要調整配置 1.1. 不要“調優”伺服器,不要使用比率、公式或“調優腳本”作為設置配置變數的基礎 1.1.1. 在互聯網上搜索配置建議並不總是一個好主意,你會在博客、論壇等找到很多糟糕的建議 1.1.2. 很難判斷誰是真正的專家 1.1.3. 不要相信流行的記憶體消耗公 ...
  • Flink是一個分散式系統,要求有效地分配和管理計算資源以執行流式應用程式。它集成了所有常見的集群資源管理器,如Hadoop YARN和Kubernetes,但也可以設置為作為standalone甚至庫運行。 本節概述了Flink的體繫結構,並描述了其主要組件如何交互以執行應用程式以及從故障中恢復。 ...
  • 1. mysql資料庫四種常見資料庫引擎 1. MyISAM: MyISAM是MySQL最早的資料庫引擎之一。它被設計成處理大量的插入和查詢操作。MyISAM表格的數據存儲在三個文件上:.frm文件存儲表結構,.MYD文件存儲數據,.MYI文件存儲索引。MyISAM表格不支持事務處理和崩潰恢復,因此 ...
  • 隨著需求的不斷開發,前端項目不斷膨脹,業務提出:你們的首頁載入也太慢啦,我都需要7、8秒才能看到內容,於是乎主管就讓我聯合後端開啟優化專項,目標是3s內展示完全首頁的內容。 性能指標 開啟優化時,我們要清晰的知道現狀和目標,以及我們採用什麼樣的手段,通過檢測什麼指標來查看到優化的過程。 結果指標 根 ...
  • 功能介紹 登錄 首頁 修改密碼 提交申請 提交列表 數據可視化 審核列表 前端 components結構 搭建Vue項目 ​ Vue3快速上手: ​ https://cn.vuejs.org/guide/quick-start.html#creating-a-vue-application 頁面佈局 ...
  • 溫馨提示:本文以vue3+vite+ts舉例,vite配置和ts語法側重較少,比較適合有vuex或者vue基礎的小伙伴們兒查閱。 安裝pinia yarn yarn add pinia npm npm install pinia pnpm pnpm add pinia 1-開始 方式一:在main. ...
  • 官方代碼是直接使用JDK的Deque對象,這樣的代碼能學到什麼?熟練操作API嗎?還是自己實現一個最小棧吧,用時擊敗100%,記憶體擊敗78% ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...