網站首頁 編程語言 正文
Bean的生命周期
Bean的執行流程:

Bean 執行流程:啟動Spring 容器 -> 實例化 Bean(分配內存空間,從無到有)-> Bean 注冊到 Spring 中(存操作) -> 將 Bean 裝配到需要的類中(取操作)。
所謂的?命周期指的是?個對象從誕?到銷毀的整個?命過程,我們把這個過程就叫做?個對象的?命周期。
Bean 的?命周期分為以下 5 ?部分:
1.實例化 Bean(為 Bean 分配內存空間)
2.設置屬性(Bean 注?和裝配)
3.Bean 初始化
實現了各種Aware 通知的?法,如 BeanNameAware、BeanFactoryAware、ApplicationContextAware 的接??法;
執?BeanPostProcessor 初始化前置?法;
執?@PostConstruct 初始化?法,依賴注?操作之后被執?;
執???指定的init-method ?法(如果有指定的話);
執?BeanPostProcessor 初始化后置?法。
4.使? Bean
5.銷毀 Bean
銷毀容器的各種?法,如@PreDestroy、重寫DisposableBean 接??法、destroy-method。
實例化和初始化的區別:
實例化和屬性設置是系統“事件”,其操作過程不可???預和修改;?初始化是給開發者提供的,可以在實例化之后,類加載完成之前進??定義“事件”處理。
Bean 的?命流程看似繁瑣,但咱們可以以?活中的場景來理解它,?如我們現在需要買?棟房?,那么我們的流程是這樣的:
1. 先買房(實例化,從?到有);
2. 裝修(設置屬性);
3. 買家電,如洗?機、冰箱、電視、空調等([各種]初始化);
4. ?住(使? Bean);
5. 賣出去(Bean 銷毀)。
為什么要先設置屬性在進?初始化呢?
很明顯是避免空指針異常。
Bean的作用域
現在有?個公共的 Bean,提供給 A ?戶和 B ?戶使?,然?在使?的途中 A ?戶卻“悄悄”地修改了公共 Bean 的數據,導致 B ?戶在使?時發?了預期之外的邏輯錯誤。
案例如下:
公共 Bean:

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

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

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

以上問題的原因是因為Bean 默認情況下是單例模式(singleton),也就是所有?的使?的都是同?個對象,使?單例可以很?程度上提?性能,所以在 Spring 中Bean 的作?域默認也是 singleton 單例模式。
所以限定程序中變量的可?范圍叫做作?域,或者說在源代碼中定義變量的某個區域就叫做作?域。?Bean 的作?域是指 Bean 在 Spring 整個框架中的某種?為模式,?如 singleton 單例作?域,就表示 Bean 在整個 Spring 中只有?份,它是全局共享的,那么當其他?修改了這個值之后,那么另?個?讀取到的就是被修改的值。
Spring 容器在初始化?個 Bean 的實例時,同時會指定該實例的作?域。Spring有 6 種作?域,最后四種是基于Spring MVC ?效的:
1. singleton:單例作?域
2. prototype:原型作?域(多例作?域)
3. request:請求作?域
4. session:回話作?域
5. application:全局作?域
6. websocket:HTTP WebSocket 作?域
注意后4 種狀態是 Spring MVC 中的值,在普通的 Spring 項?中只有前兩種。
Singleton(單例作?域):
官?說明:(Default) Scopes a single bean definition to a single object instance for each Spring IoC container.
描述:該作?域下的Bean在IoC容器中只存在?個實例:獲取Bean(即通過applicationContext.getBean等?法獲取)及裝配Bean(即通過@Autowired注?)都是同?個對象。
場景:通常?狀態的Bean使?該作?域。?狀態表示Bean對象的屬性狀態不需要更新 。
備注:Spring默認選擇該作?域
prototype原型作?域(多例作?域)
官?說明:Scopes a single bean definition to any number of object instances.
描述:每次對該作?域下的Bean的請求都會創建新的實例:獲取Bean(即通過applicationContext.getBean等?法獲取)及裝配Bean(即通過@Autowired注?)都是新的對象實例,其實這種對系統資源開銷比較大。
場景:通常有狀態的Bean使?該作?域
Request(請求作?域)
官?說明:Scopes a single bean definition to the lifecycle of a single HTTP request. That is, each HTTP request has its own instance of a bean created off the back of a single
bean definition. Only valid in the context of a web-aware Spring ApplicationContext.
描述:每次http請求會創建新的Bean實例,類似于prototype
場景:?次http的請求和響應的共享Bean
備注:限定SpringMVC中使?
Session(回話作?域)
官?說明:Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext.
描述:在?個http session中,定義?個Bean實例
場景:?戶回話的共享Bean, ?如:記錄?個?戶的登陸信息
備注:限定SpringMVC中使?
Application(全局作?域)
官?說明:Scopes a single bean definition to the lifecycle of a ServletContext. Only valid in the context of a web-aware Spring ApplicationContext.
描述:在?個http servlet Context中,定義?個Bean實例
場景:Web應?的上下?信息,?如:記錄?個應?的共享信息
備注:限定SpringMVC中使?
Websocket(HTTP WebSocket 作?域)
官?說明:Scopes a single bean definition to the lifecycle of a WebSocket. Only valid in the context of a web-aware Spring ApplicationContext.
描述:在?個HTTP WebSocket的?命周期中,定義?個Bean實例
場景:WebSocket的每次會話中,保存了?個Map結構的頭信息,將?來包裹客戶端消息頭。第?次初始化后,直到WebSocket結束都是同?個Bean。
備注:限定Spring WebSocket中使?
單例作?域(singleton)和全局作?域(application)區別
singleton 是 Spring Core 的作?域;application 是 Spring Web 中的作?域;
singleton 作?于 IoC 的容器,? application 作?于 Servlet 容器。
如何設置Bean的作用域:
1.直接設置值:@Scope("prototype")
2.使用枚舉設置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
原文鏈接:https://blog.csdn.net/crazy_xieyi/article/details/129164644
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-05-05 Python中閉包和自由變量的使用與注意事項_python
- 2022-01-30 element-ui表格的多選框CheckBox 是否可以勾選
- 2022-10-17 C#使用集合實現二叉查找樹_C#教程
- 2022-02-03 ionic 富文本編輯樣式后,前臺不能回顯樣式
- 2022-05-11 spring cloud alibaba nacos搭建最小可運行微服務
- 2022-04-18 python全面解析接口返回數據_python
- 2022-07-06 C++詳細分析講解引用的概念與使用_C 語言
- 2022-08-06 python練習之循環控制語句?break?與?continue_python
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支