Spring Beans;Spring Bean的生命周期;spring Bean的作用域,spring處理線程并發問題

文章目錄

    • Spring Beans
    • 請解釋Spring Bean的生命周期
    • 解釋Spring支持的幾種bean的作用域
      • Spring容器中的bean可以分為5個范圍:
    • Spring如何處理線程并發問題?

在現在的項目開發中經常使用到spring bean,那么來談談spring bean的生命周期,以及spring bean的作用域,以及spring又是如何來處理線程并發的問題

Spring Beans

什么是Spring beans?
Spring beans 是那些形成Spring應用的主干的java對象。它們被Spring IOC容器初始化,裝配,和管理。這些beans通過容器中配置的元數據創建。比如,以XML文件中 的形式定義。

一個 Spring Bean 定義 包含什么?
一個Spring Bean 的定義包含容器必知的所有配置元數據,包括如何創建一個bean,它的生命周期詳情及它的依賴。

如何給Spring 容器提供配置元數據?Spring有幾種配置方式
這里有三種重要的方法給Spring 容器提供配置元數據。

XML配置文件。
基于注解的配置。
基于java的配置。
Spring配置文件包含了哪些信息
Spring配置文件是個XML 文件,這個文件包含了類信息,描述了如何配置它們,以及如何相互調用。

Spring基于xml注入bean的幾種方式
Set方法注入;

構造器注入:①通過index設置參數的位置;②通過type設置參數類型;

靜態工廠注入;

實例工廠;

你怎樣定義類的作用域?
當定義一個 在Spring里,我們還能給這個bean聲明一個作用域。它可以通過bean 定義中的scope屬性來定義。如,當Spring要在需要的時候每次生產一個新的bean實例,bean的scope屬性被指定為prototype。另一方面,一個bean每次使用的時候必須返回同一個實例,這個bean的scope 屬性 必須設為 singleton。

解釋Spring支持的幾種bean的作用域
Spring框架支持以下五種bean的作用域:

singleton : bean在每個Spring ioc 容器中只有一個實例。
prototype:一個bean的定義可以有多個實例。
request:每次http請求都會創建一個bean,該作用域僅在基于web的Spring ApplicationContext情形下有效。
session:在一個HTTP Session中,一個bean定義對應一個實例。該作用域僅在基于web的Spring ApplicationContext情形下有效。
global-session:在一個全局的HTTP Session中,一個bean定義對應一個實例。該作用域僅在基于web的Spring ApplicationContext情形下有效。
注意: 缺省的Spring bean 的作用域是Singleton。使用 prototype 作用域需要慎重的思考,因為頻繁創建和銷毀 bean 會帶來很大的性能開銷。

Spring框架中的單例bean是線程安全的嗎?
不是,Spring框架中的單例bean不是線程安全的。

spring 中的 bean 默認是單例模式,spring 框架并沒有對單例 bean 進行多線程的封裝處理。

實際上大部分時候 spring bean 無狀態的(比如 dao 類),所有某種程度上來說 bean 也是安全的,但如果 bean 有狀態的話(比如 view model 對象),那就要開發者自己去保證線程安全了,最簡單的就是改變 bean 的作用域,把“singleton”變更為“prototype”,這樣請求 bean 相當于 new Bean()了,所以就可以保證線程安全了。

有狀態就是有數據存儲功能。
無狀態就是不會保存數據。
Spring如何處理線程并發問題?
在一般情況下,只有無狀態的Bean才可以在多線程環境下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域,因為Spring對一些Bean中非線程安全狀態采用ThreadLocal進行處理,解決線程安全問題。

ThreadLocal和線程同步機制都是為了解決多線程中相同變量的訪問沖突問題。同步機制采用了“時間換空間”的方式,僅提供一份變量,不同的線程在訪問前需要獲取鎖,沒獲得鎖的線程則需要排隊。而ThreadLocal采用了“空間換時間”的方式。

ThreadLocal會為每一個線程提供一個獨立的變量副本,從而隔離了多個線程對數據的訪問沖突。因為每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的變量封裝進ThreadLocal。

請解釋Spring Bean的生命周期

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

首先說一下Servlet的生命周期:實例化,初始init,接收請求service,銷毀destroy;

Spring上下文中的Bean生命周期也類似,如下:

(1)實例化Bean:

對于BeanFactory容器,當客戶向容器請求一個尚未初始化的bean時,或初始化bean的時候需要注入另一個尚未初始化的依賴時,容器就會調用createBean進行實例化。對于ApplicationContext容器,當容器啟動結束后,通過獲取BeanDefinition對象中的信息,實例化所有的bean。

(2)設置對象屬性(依賴注入):

實例化后的對象被封裝在BeanWrapper對象中,緊接著,Spring根據BeanDefinition中的信息 以及 通過BeanWrapper提供的設置屬性的接口完成依賴注入。

(3)處理Aware接口:

接著,Spring會檢測該對象是否實現了xxxAware接口,并將相關的xxxAware實例注入給Bean:

①如果這個Bean已經實現了BeanNameAware接口,會調用它實現的setBeanName(String beanId)方法,此處傳遞的就是Spring配置文件中Bean的id值;

②如果這個Bean已經實現了BeanFactoryAware接口,會調用它實現的setBeanFactory()方法,傳遞的是Spring工廠自身。

③如果這個Bean已經實現了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文;

(4)BeanPostProcessor:

如果想對Bean進行一些自定義的處理,那么可以讓Bean實現了BeanPostProcessor接口,那將會調用postProcessBeforeInitialization(Object obj, String s)方法。

(5)InitializingBean 與 init-method:

如果Bean在Spring配置文件中配置了 init-method 屬性,則會自動調用其配置的初始化方法。

(6)如果這個Bean實現了BeanPostProcessor接口,將會調用postProcessAfterInitialization(Object obj, String s)方法;由于這個方法是在Bean初始化結束時調用的,所以可以被應用于內存或緩存技術;

以上幾個步驟完成后,Bean就已經被正確創建了,之后就可以使用這個Bean了。

(7)DisposableBean:

當Bean不再需要時,會經過清理階段,如果Bean實現了DisposableBean這個接口,會調用其實現的destroy()方法;

(8)destroy-method:

最后,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動調用其配置的銷毀方法。

解釋Spring支持的幾種bean的作用域

Spring容器中的bean可以分為5個范圍:

(1)singleton:默認,每個容器中只有一個bean的實例,單例的模式由BeanFactory自身來維護。

(2)prototype:為每一個bean請求提供一個實例。

(3)request:為每一個網絡請求創建一個實例,在請求完成以后,bean會失效并被垃圾回收器回收。

(4)session:與request范圍類似,確保每個session中有一個bean的實例,在session過期后,bean會隨之失效。

(5)global-session:全局作用域,global-session和Portlet應用相關。當你的應用部署在Portlet容器中工作時,它包含很多portlet。如果你想要聲明讓所有的portlet共用全局的存儲變量的話,那么這全局變量需要存儲在global-session中。全局作用域與Servlet中的session作用域效果相同。

8、Spring框架中的單例Beans是線程安全的么?

    Spring框架并沒有對單例bean進行任何多線程的封裝處理。關于單例bean的線程安全和并發問題需要開發者自行去搞定。但實際上,大部分的Spring bean并沒有可變的狀態(比如Serview類和DAO類),所以在某種程度上說Spring的單例bean是線程安全的。如果你的bean有多種狀態的話(比如 View Model 對象),就需要自行保證線程安全。最淺顯的解決辦法就是將多態bean的作用域由“singleton”變更為“prototype”。

Spring如何處理線程并發問題?

在一般情況下,只有無狀態的Bean才可以在多線程環境下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域,因為Spring對一些Bean中非線程安全狀態采用ThreadLocal進行處理,解決線程安全問題。

ThreadLocal線程同步機制都是為了解決多線程中相同變量的訪問沖突問題。同步機制采用了“時間換空間”的方式,僅提供一份變量,不同的線程在訪問前需要獲取鎖,沒獲得鎖的線程則需要排隊。而ThreadLocal采用了“空間換時間”的方式。

ThreadLocal會為每一個線程提供一個獨立的變量副本,從而隔離了多個線程對數據的訪問沖突。因為每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的變量封裝進ThreadLocal。

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

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

相關文章

APP軟件線上排查方法

在線上環境中排查APP軟件的問題是一項關鍵任務,需要使用一系列方法和工具來識別、定位和解決問題。以下是一些建議的排查方法,希望對大家有所幫助。北京木奇移動技術有限公司,專業的軟件外包開發公司,歡迎交流合作。 1.監控和日志…

linux如何查看文件的hash數值

在Linux系統中,你可以使用各種工具來查看文件的哈希值。下面是一些常見的方法: md5sum命令: md5sum 文件名例如: md5sum example.txtsha1sum命令: sha1sum 文件名例如: sha1sum example.txtsha256sum命令&a…

SQLServer的常用數據類型

常用數據類型 關于數據類型大家可能并不陌生,因為我們在C#中學了常用的數據類型,在數據庫中其實也差不多,大部分都有對應關系的,只是關鍵字上有差別,接下來我們講一下,請大家記住常用的就行。 第一、文本…

代碼規范有用嗎?聽聽100W年薪谷歌大佬怎么說!

谷歌內部的 python 代碼規范 熟悉 python 一般都會努力遵循 pep8 規范,也會有一些公司制定內部的代碼規范。大公司制定規范的目的不是說你一定要怎樣去使用編程語言,而是讓大家遵守同一套規則,節省其他人閱讀代碼的成本,方便協作…

紅酒按照糖含量怎么分類?

我們常聽人們形容葡萄酒為干型或甜型,這指的是葡萄酒的含糖量。不含糖就是干型,含糖少就是半干型,含糖多就是甜型,這是葡萄酒分類的一種——按糖量分。云倉酒莊的品牌雷盛紅酒分享一般分為干型、半干型、半甜型、甜型四種。 云倉…

get data from Nacos error,dataId:服務名

2023-11-23 09:44:35.595 ERROR 169 — [ main] c.a.n.client.config.impl.ClientWorker : [fixed-100.66.12.65_8848] [sub-server-error] no right, dataIdcampaign-task-service, groupcampaign, tenant 2023-11-23 09:44:35.598 ERROR 169 — [ main] c.a.c.n.c.NacosPrope…

Jetson orin(Ubuntu20.04)不接顯示器無法輸出VNC圖像解決辦法以及vnc安裝記錄

sudo apt install vino 好像Jetpack 5.0中已經自帶了。。 配置VNC server: gsettings set org.gnome.Vino prompt-enabled false gsettings set org.gnome.Vino require-encryption false 編輯org.gnome,增加一個“enabled key”的參數: cd /usr/share/glib-2…

氮化鎵的晶體學濕式化學蝕刻法

引言 目前,大多數III族氮化物的加工都是通過干法等離子體蝕刻完成的。干法蝕刻有幾個缺點,包括產生離子誘導損傷和難以獲得激光器所需的光滑蝕刻側壁。干法蝕刻產生的側壁典型均方根(rms)粗糙度約為50納米,雖然已經發現KOH基溶液可以蝕刻AlN…

Android:Google三方庫之Firebase集成詳細步驟(三)

Cloud Messaging 1、清單文件配置 a、(可選)一項擴展 FirebaseMessagingService 的服務。除了接收通知外,如果您還希望在后臺應用中進行消息處理,則必須添加此服務。例如,您需要在前臺應用中接收通知、接收數據載荷以及…

服務臺需要跟蹤的3個重要指標MTBF+MTTF+MTTR

衡量標準是IT服務管理的核心,可提供有關運營的見解,并幫助確定需要持續改進的領域。通常的服務臺指標有助于展示內部運營效率。例如,衡量在規定時間內解決問題的工單數量的 SLA 是展示服務臺效率的關鍵因素。另一方面,故障指標可幫…

阿里云服務器(vgn7i-vws) anaconda(py39)+pytorch1.12.0(cu113)

安裝anaconda 2022 10 py3.9 wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh sha256sum Anaconda3-2022.10-Linux-x86_64.sh #校驗數據完整性 chmod ux Anaconda3-2022.10-Linux-x86_64.sh #添加執行權限 bash Anaconda3-2022.10-Linux-x86_…

ate測試原理及ate測試系統(軟件)知識科普 -納米軟件

ATE(Automatic Test Equipment)測試也叫自動化測試,通過計算機控制測試儀器對被測對象進行測試。以計算機編程代替人工測試,基于測試程序控制儀器并對待測品進行輸入和輸出信號檢測分析,從而判斷待測品的性能是否符合要求。 ATE測試需要根據測…

linux進程調度(一)-進程概述

一、什么是進程 進程是指計算機已運行的程序。程序本身只是指令、數據及其組織形式的描述。進程就是一個程序的執行實例,也就是正在執行的程序。在linux操作系統的中,進程就是一個擔當分配系統資源CPU時間、內存的實體。進程控制的主要功能是對系統中的所…

Kafka報錯under-replicated partitions

1 under-replicated partitions異常原因 Kafka報錯under replicated partitions意味著某些分區的副本數量未達到預期的復制因子。 主要有兩種原因, Broker故障 如果某個Kafka Broker發生故障,導致其中一些分區的副本不再可用,那么這些分區就…

2023年微軟開源八個人工智能項目

自2001年軟件巨頭微軟前首席執行官史蒂夫鮑爾默對開源(尤其是Linux)發表尖刻言論以來,微軟正在開源方面取得了長足的進步。繼ChatGPT于去年年底發布了后,微軟的整個2023年,大多數技術都是面向開發人員和研究人員公開發…

Towhee介紹

官方網站:Towhee | Home - Towhee Towhee 是一個尖端框架,旨在通過使用基于大型語言模型 (LLM) 的管道編排來簡化非結構化數據的處理。它具有獨特的優勢,可以從各種非結構化數據類型(包括冗長的文本、圖像…

淺談進程與線程

文章目錄 一. 進程🍎什么是程序?什么是進程?🍋程序的并發性和并行性🍉進程誕生的原因🍑PCB 二. 線程🍥什么是線程?🍦為什么引入線程? 三. 進程與線程的區別與…

HarmonyOS 設備管理開發:USB 服務開發指導

基本概念 USB 服務是應用訪問底層的一種設備抽象概念。開發者根據提供的 USB API,可以獲取設備列表、控制設備訪問權限、以及與連接的設備進行數據傳輸、控制命令傳輸等。 運作機制 USB 服務系統包含 USB API、USB Service、USB HAL。 圖 1 USB 服務運作機制 ●…

【SpringBoot3+Vue3】五【完】【實戰篇】-前端(配合后端)

目錄 一、環境準備 1、創建Vue工程 2、安裝依賴 2.1 安裝項目所需要的vue依賴 2.2 安裝element-plus依賴 2.2.1 安裝 2.2.2 項目導入element-plus 2.3 安裝axios依賴 2.4 安裝sass依賴 3、目錄調整 3.1 刪除部分默認目錄下文件 3.1.1 src/components下自動生成的…

JeecgBoot3.5漏洞升級—快速文檔

近幾年來,黑客攻擊行為呈現出日益復雜和隱蔽的趨勢,對個人和組織的安全造成了嚴重威脅。黑客們不斷尋找新的漏洞和安全漏洞,利用各種手段進行網絡攻擊,包括惡意軟件、網絡釣魚、勒索軟件等。因此,我們每個人都需要關注…