Spring(三):Spring中Bean的生命周期和作用域

前言

在 Spring 中,那些組成應用程序的主體及由 Spring IOC 容器所管理的對象,被稱之為 bean。簡單地講,bean 就是由 IOC 容器初始化、裝配及管理的對象,除此之外,bean 就與應用程序中的其他對象沒有什么區別了。而 bean 的定義以及 bean 相互間的依賴關系將通過配置元數據來描述。

Spring中的bean默認都是單例的。

1. 概念引入

我們來用一個案例進行演示:

假設現在有?個公共的 Bean,提供給 A ?戶和 B ?戶使?,然?在使?的途中 A ?戶卻“悄悄”地修改了公共 Bean 的數據,導致 B ?戶在使?時發?了預期之外的邏輯錯誤。

我們預期的結果是,公共Bean可以在自己的類中進行修改,但不能影響其他類.

代碼如下:

有一個公共的Bean對象Users


@Componentpublic class Users {@Beanpublic User user1() {User user = new User();user.setId(1);user.setName("李四"); return user;}}

?A 用戶使用時,進行了修改操作:

@Controller
public class BeanScopesController {@Autowiredprivate User user1;public User getUser1() {User user = user1;System.out.println("Bean 原 Name:" + user.getName());user.setName("王五"); return user;}
}

B 用戶再去使用公共 Bean 的時候:

@Controller
public class BeanScopesController2 {@Autowiredprivate User user1;public User getUser1() {User user = user1;return user;}
}

打印 A 用戶和 B 用戶公共 Bean 的值:

public class BeanScopesTest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");BeanScopesController beanScopesController = context.getBean(BeanScopesController.class);System.out.println("A 對象修改之后 Name:" + beanScopesController.getUser1().toString());BeanScopesController2 beanScopesController2 = context.getBean(BeanScopesController2.class);System.out.println("B 對象讀取到的 Name:" + beanScopesController2.getUser1().toString());}
}

最終輸出:

Bean 原 name: 李四

A 對象修改之后 Name: 1:王五

B 對象讀取到的?Name: 1:王五

原因分析:

操作以上問題的原因是因為 Bean 默認情況下是單例狀態(singleton),也就是所有?的使用的都是同?個對象,之前我們學單例模式的時候都知道,使用單例可以很大程度上提高性能,所以在 Spring 中Bean 的作用域默認也是 singleton ?單例模式。

2. 作?域定義

限定程序中變量的可?范圍叫做作?域,或者說在源代碼中定義變量的某個區域就叫做作?域。
? Bean 的作?域是指 Bean 在 Spring 整個框架中的某種?為模式,?如 singleton 單例作?域,就 表示 Bean 在整個 Spring 中只有?份,它是全局共享的,那么當其他?修改了這個值之后,那么另? 個?讀取到的就是被修改的值。

2.1 Bean的6種作用域

Spring 容器在初始化?個 Bean 的實例時,同時會指定該實例的作?域。Spring有 6 種作?域,最后 四種是基于 Spring MVC ?效的:
  1. singleton:單例作?域
  2. prototype:原型作?域(多例作?域)
  3. request:請求作?域
  4. session:回話作?域
  5. application:全局作?域
  6. websocket:HTTP WebSocket 作?域

singleton?:只在加載的時候創建對象,后續如果發生改變,重新請求會得到改變之后的Bean對象。
prototype :每次獲取的對象就是初始對象
request?:請求作用域:一次http請求一個Bean對象
session :? 會話作用域:一次會話使用一個Bean對象,相對于Request作用域更廣。
application :? 全局作用域:一個httpServletContext中共用一個Bean對象一個上下文里面進行共享Bean對象
websocket? :WebSocket的每次會話中,保存了?個Map結構的頭信息,將?來包裹客戶端消息頭。第一次初始化后,直到WebSocket結束都是同?個Bean。

2.2 設置作?域

設置作用域的方式有兩種:?

3. Spring的執行流程

面試題:Bean 的執行流程:
Bean 執?流程(Spring 執?流程):
啟動 Spring 容器 -> 實例化 Bean(分配內存空間,從?到 有) -> Bean 注冊到 Spring 中(存操作) -> 將 Bean 裝配到需要的類中(取操作)。

3.1 Bean ?命周期

所謂的?命周期指的是?個對象從誕?到銷毀的整個?命過程,我們把這個過程就叫做?個對象的?命 周期。
Bean 的?命周期分為以下 5 ?部分:
1.實例化 Bean(為 Bean 分配內存空間)
2.設置屬性(Bean 注?和裝配)
3.Bean 初始化
????????實現了各種 Aware 通知的?法,如 BeanNameAware、BeanFactoryAware、
????????ApplicationContextAware 的接??法;
????????執? BeanPostProcessor 初始化前置?法;
????????執? @PostConstruct 初始化?法,依賴注?操作之后被執?;
????????執???指定的 init-method ?法(如果有指定的話);
????????執? BeanPostProcessor 初始化后置?法。
4.使? Bean
5.銷毀 Bean
如下圖所示:

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

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

相關文章

Oracle數據庫運維大全

以下是一些常見的Oracle數據庫運維任務和對應的語句腳本示例: 檢查數據庫實例狀態: SELECT instance_name, status, startup_time FROM v$instance; 查看數據庫版本和補丁級別: SELECT * FROM v$version; SELECT patch_id, action, status …

LeetCode 熱題 100(四):48. 旋轉圖像、240. 搜索二維矩陣 II、234. 回文鏈表

一.48. 旋轉圖像 題目要求:就是一個順時針的旋轉過程。 思路:觀察矩陣,得出翻轉前第i行的第J個元素 等于 翻轉后倒數第i列的第J個元素,舉例說明,第1行第2個元素為“2”,翻轉后到了 倒數第1列的第2個元素…

MAC環境,在IDEA執行報錯java: -source 1.5 中不支持 diamond 運算符

Error:(41, 51) java: -source 1.5 中不支持 diamond 運算符 (請使用 -source 7 或更高版本以啟用 diamond 運算符) 進入設置 修改java版本 pom文件中加入 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin&l…

vue項目預覽pdf功能(解決動態文字無法顯示的問題)

最近&#xff0c;因為公司項目需要預覽pdf的功能&#xff0c;開始的時候找了市面上的一些pdf插件&#xff0c;都能用&#xff0c;但是&#xff0c;后面因為pdf變成了需要根據內容進行變化的&#xff0c;然后&#xff0c;就出現了需要動態生成的文字不顯示了。換了好多好多的插件…

Flink安裝與使用

1.安裝準備工作 下載flink Apache Flink: 下載 解壓 [dodahost166 bigdata]$ tar -zxvf flink-1.12.0-bin-scala_2.11.tgz 2.Flinnk的standalone模式安裝 2.1修改配置文件并啟動 修改&#xff0c;好像使用默認的就可以了 [dodahost166 conf]$ more flink-conf.yaml 啟動 …

【辦公自動化】使用Python批量生成PPT版榮譽證書

&#x1f935;?♂? 個人主頁&#xff1a;艾派森的個人主頁 ?&#x1f3fb;作者簡介&#xff1a;Python學習者 &#x1f40b; 希望大家多多支持&#xff0c;我們一起進步&#xff01;&#x1f604; 如果文章對你有幫助的話&#xff0c; 歡迎評論 &#x1f4ac;點贊&#x1f4…

RocketMQ消費者可以手動消費但無法主動消費問題,或生成者發送超時

1.大多數是配置問題 修改rocketmq文件夾broker.conf 2.配置與集群IP或本地IPV4一樣 重啟 在RocketMQ獨享實例中支持IPv4和IPv6雙棧&#xff0c;主要是通過在網絡層面上同時支持IPv4和IPv6協議棧來實現的。RocketMQ的Broker端、Namesrv端和客戶端都需要支持IPv4和IPv6協議&…

Python土力學與基礎工程計算.PDF-螺旋板載荷試驗

python 求解代碼如下&#xff1a; 1. import numpy as np 2. 3. # 已知參數 4. p_a 100 # 標準壓力&#xff0c; kPa 5. p np.array([25, 50, 100, 200) # 荷載&#xff0c; kPa 6. s np.array([2.88, 5.28, 9.50, 15.00) / 10 # 沉降量&#xff0c; cm 7. D 10 # 螺旋板直…

C語言:選擇+編程(每日一練)

目錄 選擇題&#xff1a; 題一&#xff1a; 題二&#xff1a; 題三&#xff1a; 題四&#xff1a; 題五&#xff1a; 編程題&#xff1a; 題一&#xff1a;尼科徹斯定理 示例1 題二&#xff1a;等差數列 示例2 本人實力有限可能對一些地方解釋和理解的不夠清晰&…

Redis知識(一)

目錄 Redis過期刪除和內存淘汰策略&#xff1a; 過期刪除策略&#xff1a; 內存淘汰策略&#xff08;解決內存過大問題&#xff09;&#xff1a; LRU和LFU以及他們在Redis里的實現 主從復制 哨兵模式 緩存 緩存雪崩 緩存擊穿 緩存穿透 數據庫和緩存一致性問題 Redis…

windows下redis服務啟動及.bat文件中中redis服務的啟動

windows windows下redis服務的啟動 1、不配置環境變量 找到redis服務的安裝目錄進入命令行窗口并輸入命令redis-server.exe redis.windows.conf2、配置環境變量 將redis安裝目錄配置在path環境變量中之后就可以在cmd窗口的任意位置輸入redis-server命令就可以啟動redis服務…

材料行業可以轉IC設計后端嗎?

近來有許多材料行業的小伙伴通過后臺來問我對于職業規劃的看法&#xff0c;甚至有些小伙伴直接點明了某個行業適不適合自己&#xff0c;那么我這邊僅以近年來比較熱門的數字芯片設計來展開講講&#xff0c;材料適不適合轉行做IC呢。 對于理工科的同學而言&#xff0c;選擇哪個…

Graal 編譯器

一開始,我們來講一個故事。假設有一個名為 John 的開發人員,他正在嘗試編寫一些高性能的 Java 代碼。他遇到了一些性能和速度問題,因為他的應用需要經常從大量的數據源中獲取數據,并進行計算。他嘗試了許多優化工具和技術,但是仍然無法滿足他的需求。在這個時候,他聽說了…

公告:微信小程序備案期限官方要求

備案期限要求 1、若微信小程序未上架&#xff0c;自2023年9月1日起&#xff0c;微信小程序須完成備案后才可上架&#xff0c;備案時間1-20日不等&#xff1b; 2、若微信小程序已上架&#xff0c;請于2024年3月31日前完成備案&#xff0c;逾期未完成備案&#xff0c;平臺將按照…

Android Studio實現列表展示圖片

效果&#xff1a; MainActivity 類 package com.example.tabulation;import android.content.Intent; import android.os.Bundle; import android.view.View;import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; im…

解決 Maven 創建 Spring Boot 項目時出現 “Cannot access alimaven“ 錯誤的方法

系列文章目錄 文章目錄 系列文章目錄前言一、確認 Maven 配置二、創建 Spring Boot 項目三、修改項目的 Maven 配置四、清除 Maven 本地倉庫五、重新構建項目總結前言 Maven 是 Java 項目的構建工具,而 Spring Boot 則是用于快速構建 Spring 應用程序的框架。但有時,在創建 …

Redis擴容與一致性Hash算法解析

推薦閱讀 AI文本 OCR識別最佳實踐 AI Gamma一鍵生成PPT工具直達鏈接 玩轉cloud Studio 在線編碼神器 玩轉 GPU AI繪畫、AI講話、翻譯,GPU點亮AI想象空間 資源分享 「java、python面試題」來自UC網盤app分享&#xff0c;打開手機app&#xff0c;額外獲得1T空間 https://dr…

Java導出數據到Excel

系列文章目錄 文章目錄 系列文章目錄前言一、為什么需要導出數據到Excel?二、使用Java導出數據到Excel的步驟1.添加依賴2.編寫導出邏輯3.運行測試總結前言 當今數據處理的場景中,Excel仍然是一個不可或缺的工具,用于存儲、分析和共享數據。在Java應用程序中,有時候需要將數…

神經網絡基礎-神經網絡補充概念-04-梯度下降法

概念 梯度下降法是一種常用的優化算法&#xff0c;用于在機器學習和深度學習中更新模型參數以最小化損失函數。它通過迭代地調整參數&#xff0c;沿著損失函數的負梯度方向移動&#xff0c;從而逐步逼近損失函數的最小值。 基本思想 梯度下降法的基本思想是&#xff1a;在每…

JVM——引言+JVM內存結構

引言 什么是JVM 定義: Java VirtualMachine -java 程序的運行環境 (ava 二進制字節碼的運行環境) 好處: 一次編寫&#xff0c;到處運行自動內存管理&#xff0c;垃圾回收功能數組下標越界檢查&#xff0c;多態 比較: jvm jre jdk 學習jvm的作用 面試理解底層實現原理中…