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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...