成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官問我Spring Bean,我一口氣...

開發(fā) 前端
我們每天都會接觸到各種的bean對象,之前也介紹了,spring提供了IOC來完成bean的創(chuàng)建,讓我們大家不用new就可以直接拿到對象,使用對象了.

[[438671]]

前言

spring bean,其實(shí)經(jīng)常用spring的開發(fā)人員來說,這個單詞并不陌生,應(yīng)該是相當(dāng)熟悉,我們每天都會接觸到各種的bean對象,之前也介紹了,spring提供了IOC來完成bean的創(chuàng)建,讓我們大家不用new就可以直接拿到對象,使用對象了

我們來看一下spring bean的定義,spring官方文檔對于bean的解釋是:

  1. In Spring, the objects that form the backbone of your application  
  2. and that are managed by the Spring IoC container are called beans. 
  3. A bean is an object that is instantiated, assembled, and otherwise 
  4. managed by a Spring IoC container. 

翻譯過來就是:

在 Spring 中,構(gòu)成應(yīng)用程序主干并由Spring IoC容器管理的對象稱為bean。bean是一個由Spring IoC容器實(shí)例化、組裝和管理的對象。

概念很簡單明了,我們提取處關(guān)鍵的信息:

  • bean是對象,一個或者多個不限定
  • bean由Spring中一個叫IoC的東西管理
  • 我們的應(yīng)用程序由一個個bean構(gòu)成

下面我們會從springbean的作用域、定義繼承、前置和后置處理器、生命周期(加載過程)等幾個方面來分析springbean,讓大家對其更加熟悉,面試直接起飛

作用域

springbean的作用域分為下面這幾種

1、singleton:單例作用域

2、prototype:每次從容器中調(diào)用Bean時,都會返回一個新的實(shí)例,即相當(dāng)于執(zhí)行一次new的實(shí)例化操作

3、request:每次HTTP請求調(diào)用Bean時,spring容器都會創(chuàng)建一個新的Bean

4、session:同一個Http Session共享一個Bean,不同的session使用不同的bean

5、globalSession:全局session共享一個Bean,僅用于WebApplication環(huán)境

singleton:單例作用域

singleton在 Spring 容器中僅存在一個 Bean 實(shí)例, Bean 以單例的形式存在。

Spring 以容器的方式,使得我們僅需配置,即可得到天然的單例模式。

一般情況下,無狀態(tài)或者狀態(tài)不可變的類適合使用單例模式來實(shí)現(xiàn), 不過 Spring 利用 AOP 和 LocalThread 的能力,對非線程安全的變量(狀態(tài))進(jìn)行了特殊處理,使的一些非線程安全的類(持有 Connection 的 DAO 類)變成了線程安全的類 。

因為 Spring 的超強(qiáng)能力,所以在實(shí)際應(yīng)用中,大部分 Bean 都能以單例方式運(yùn)行 ,這也是 bean 的默認(rèn)作用域指定為 singleton 的原因 。

singleton 的 Bean 在同一個 Spring IoC 容器中只會一個實(shí)例。

prototype:每次從容器中調(diào)用Bean時,都會返回一個新的實(shí)例,即相當(dāng)于執(zhí)行一次new的實(shí)例化操作

prototype 作用域的 bean 會導(dǎo)致在每次對該 bean 請求(將其注入到另一個 bean 中,或者以程序的方式調(diào)用容器的 getBean() 方法)時都會創(chuàng)建一個新的 bean 實(shí)例。

Prototype 是原型類型,它在我們創(chuàng)建容器的時候并沒有實(shí)例化,而是當(dāng)我們獲取bean的時候才會去創(chuàng)建一個對象,而且我們每次獲取到的對象都不是同一個對象。

根據(jù)經(jīng)驗,對有狀態(tài)的 bean 應(yīng)該使用 prototype 作用域,而對無狀態(tài)的bean則應(yīng)該使用 singleton 作用域。

此外, Spring 容器將 prototype 的 bean 交給調(diào)用者后,就不再負(fù)責(zé)管理它的生命周期咯。

request:每次HTTP請求調(diào)用Bean時,spring容器都會創(chuàng)建一個新的Bean

每次 http 請求都會創(chuàng)建一個新的 Bean , 僅用于 WebApplicationContext 環(huán)境。request 作用域的 Bean 對應(yīng)一個 HTTP 請求和生命周期 。

每次 HTTP 請求調(diào)用 Bean 時, Spring 容器就會創(chuàng)建一個新的 Bean ;請求處理完畢,就會銷毀這個 Bean。

session:同一個Http Session共享一個Bean,不同的session使用不同的bean

同一個 http Session 共享一個 Bean ,不同的 http Session 使用不同的 Bean,僅用于 WebApplicationContext 環(huán)境。

Bean 的作用于橫跨整個 HTTP Session。Session 中的所有 HTTP 請求會共享同一個 Bean. 只有當(dāng) HTTP Session 結(jié)束后,Bean實(shí)例才會被銷毀 。

globalSession:全局session共享一個Bean,僅用于WebApplication環(huán)境

globalSession同一個全局 Session 共享一個 bean,用于 Porlet,僅用于 WebApplication 環(huán)境。

globalSession 的作用域類似于 session 作用域, 不過僅在 Portlet 的 Web 應(yīng)用中使用 。Portlet 定義了全局 Session,它被組成 Portlet Web 應(yīng)用的所有子 Portlet 共享。如果不在 Portlet 的 Web 應(yīng)用下,globalSession 等價于 session

定義繼承和前置后置處理器

定義繼承:bean定義可以包含很多的配置信息,包含構(gòu)造函數(shù)的參數(shù)、屬性值,容器的具體信息例如初始化方法,靜態(tài)工廠方法名等

子Bean可以繼承父Bean的配置數(shù)據(jù),當(dāng)然也可以去重寫其中的值,或者添加值,Springbean的定義繼承和Java的類繼承無關(guān),但是呢,道理是一樣的,我們可以定義一個父Bean來作為模板,然后多個子Bean就可以從父Bean中繼承所需的配置

接下來我們看前置處理器和后置處理器,顧名思義,前置,指的是實(shí)例化對象之前的處理。后置,指的是實(shí)例化對象之后的處理。

前置處理器

在Spring中的前置處理器的接口是BeanFactoryPostProcess,這個機(jī)制允許我們在實(shí)例化相應(yīng)的對象之前,對注冊到容器中的BeanDefinition存儲信息進(jìn)行相應(yīng)的修改

拿到了Provider的信息之后就可以通過監(jiān)聽觸發(fā) Protocol# refer 了,具體調(diào)用哪個 protocol 還是得看 URL的協(xié)議的,我們看下這個內(nèi)部DubboProtocol的refer

可以根據(jù)這個機(jī)制對Bean增加其它信息,修改Bean定義的某些屬性值。想自定義前置處理器需要實(shí)現(xiàn)BeanFactoryPostProcess接口。當(dāng)一個容器存在多種前置處理的時候,可以讓前置處理器的實(shí)現(xiàn)類同時繼承Ordered接口,顧名思義,就是用來排序的,可以實(shí)現(xiàn)優(yōu)先級。

Spring容器提供了數(shù)種現(xiàn)成的前置處理器,常見的如:

PropertyPlaceholderConfigurer:允許在xml文件中使用占位符。將占位符代表的資源單獨(dú)配置到簡單的Properties文件中加載

PropertyOverrideConfigurer:不同于PropertyPlaceholderConfigurer的是,該類用于處理容器中的默認(rèn)值覆為新值的場景

CustomEditorConfigurer:此前的兩個前置處理器處理的均是BeanDefinition.通過把BeanDefinition的數(shù)據(jù)修改達(dá)到目的。CustomEditorConfigurer沒有對BeanDefinition做任何變動。負(fù)責(zé)的是將后期會用到的信息注冊到容器之中。例如將類型轉(zhuǎn)換器注冊到BeanDefinition中。供BeanDefinition將獲取到的String類型參數(shù)轉(zhuǎn)換為需要的類型。

后置處理器

在Spring中的后置處理器是BeanPostProcessor接口

在Spring中的后置處理器是BeanPostProcessor接口

可以看到有兩個方法BeanBeforePostProcessor和BeanAfterPostProcessor,我們根據(jù)方法名也能猜出個大概,大概就是一個是前面執(zhí)行的,一個是后面執(zhí)行的咯

可是問題來了,我們上面不是看了一個前置處理器了嗎,為什么這里又來了一個before,那這個before和after是針對于什么來說的呢

這里的before和after是相對于對象的初始化來說的,上面的前置處理器和后置處理器是針對于對象的實(shí)例化,兩者的范圍是不一樣的

實(shí)例化就是我們常說的,創(chuàng)建一個Bean的過程,即調(diào)用Bean的構(gòu)造函數(shù);而初始化的過程則是一個賦值的過程,即調(diào)用Bean的setter,設(shè)置Bean的屬性的過程

生命周期(加載過程)

springbean的生命周期,也就是加載過程,這應(yīng)該也是和spring的循環(huán)依賴一樣,也是屬于面試常問的一個點(diǎn)了,不知道大家被問到過沒,反正我是被問到過,spring的話題本來就是面試非常愛問的一點(diǎn),IOC和AOP這是經(jīng)常問的,也是屬于最基礎(chǔ)的

稍微涉及到源碼的部分,都會問到循環(huán)依賴的三級緩存怎么工作的,為什么不用兩級緩存,bean的生命周期等問題

廢話少說了,多學(xué)學(xué)數(shù)據(jù)結(jié)構(gòu)和算法,多學(xué)學(xué)spring,通吃

我們來看下springbean的生命周期流程,可以分為幾個階段

1、實(shí)例化過程

2、后置處理和放入緩存(這一步是為了循環(huán)依賴)

3、初始化過程(屬性賦值)

4、銷毀過程

主要的邏輯是在doCreateBean()方法,其實(shí)源碼的注釋也很清晰,大家可以多去讀讀源碼,真的很不錯,大家沒事的時候其實(shí)不用刷太多無用的博客,當(dāng)然我這是有用的,關(guān)注還是很重要的!畢竟關(guān)注了不迷路,當(dāng)你下次找工作,還在為不知道該復(fù)習(xí)什么的時候,或者不知道該復(fù)習(xí)哪些知識點(diǎn)的時候,我這個號啊,是真香

重要的是重要的是重要的是!我還會把所有相關(guān)的技術(shù)文章都給匯總起來,放到了GitHub上,大家可以隨時閱讀

公眾號一關(guān)注,時常讀幾篇技術(shù)文章,還可以閱讀以下靈魂文章;GitHub地址一收藏,下次面試再也不愁,offer輕松拿到手,直接起飛

我把這個源碼給貼出來,其實(shí)有點(diǎn)多,大家不用去細(xì)讀,讀個大概的流程就可以了

這一個方法真的很長,也是主要流程,簡單看一下

首先就是實(shí)例化Bean,然后呢,就是和我們上面所說的后置處理器有關(guān)了,允許后置處理器去修改相應(yīng)的屬性,接著是把這個實(shí)例Bean直接放入到緩存中,而且是很急切的放入到緩存中去了!

相信大家看夠我上一篇的spring循環(huán)依賴的同學(xué)應(yīng)該都很熟悉,知道為啥這里要急切的放入到緩存中了,沒錯,就是為了解決spring中的循環(huán)依賴的問題的

接著就是屬性的設(shè)置和初始化過程了,這一階段主要是進(jìn)行屬性的賦值咯,這里有的小伙伴有一個誤解,認(rèn)為這一塊會為屬性分配內(nèi)存空間,不是的。分配內(nèi)存的操作是在實(shí)例化Bean的過程中,這個過程JVM就已經(jīng)完成了內(nèi)存空間的分配了

最后一步就是銷毀咯,這一步實(shí)在也沒啥好說的了

好了,這應(yīng)該就是要說的所有了,關(guān)于bean想了解更詳細(xì)的可以去讀源碼,真的很建議大家讀讀關(guān)鍵地方的源碼,很多小伙伴對于讀源碼也是很頭疼的,教大家一個好法子,大家在讀源碼的時候,可以先找準(zhǔn)其中的關(guān)鍵地方,怎么找?谷歌,百度!

找到關(guān)鍵的地方,然后一步步的去研究源碼的設(shè)計流程和某些地方的細(xì)節(jié),千萬不要把每一個細(xì)節(jié)都要認(rèn)真讀懂,真的沒啥必要,浪費(fèi)時間,抓住重點(diǎn),去讀那些關(guān)鍵的地方

下次準(zhǔn)備跳槽的時候再也不用擔(dān)心該復(fù)習(xí)什么了啊!

 

責(zé)任編輯:姜華 來源: Java賊船
相關(guān)推薦

2020-04-16 12:42:42

附近的人共享單車App

2020-08-12 09:55:07

附近的人數(shù)據(jù)庫MySQL

2020-12-21 06:07:35

Mybatis設(shè)計模式

2020-05-08 10:08:21

延時隊列APIDelayQueue

2020-03-31 08:12:25

Kafka架構(gòu)數(shù)據(jù)庫

2021-06-08 22:43:07

IPC方式Qt

2021-03-29 12:22:25

微信iOS蘋果

2025-05-14 01:55:00

FCMCPAI

2020-04-14 13:32:56

@Transacti失效場景

2023-12-18 23:09:25

開源優(yōu)化引擎

2024-01-29 00:29:49

通信技術(shù)行業(yè)

2020-11-04 14:20:58

分布式數(shù)據(jù)庫MySQL

2020-07-31 10:15:32

分布式ID數(shù)據(jù)庫MySQL

2020-09-24 09:08:04

分布式系統(tǒng)架構(gòu)

2020-10-22 12:30:33

MySQL

2022-05-24 11:50:46

延時消息分布式

2021-05-18 09:03:16

Gomapslice

2020-07-08 07:45:44

OAuth2.0授權(quán)

2024-04-26 09:40:10

項目精度丟失javascrip

2021-03-01 18:52:39

工具在線瀏覽器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 性色在线| 亚洲天堂999| 97超碰在线免费 | 性高湖久久久久久久久3小时 | 天天操夜夜操 | 国产一区高清 | 亚洲成人一区二区在线 | 国内精品99 | 91麻豆精品国产91久久久更新资源速度超快 | 欧美日韩视频在线播放 | 成人在线中文字幕 | www亚洲免费国内精品 | 久久精品免费 | www国产成人免费观看视频,深夜成人网 | 黄色免费av | 手机看片169 | 免费看黄色小视频 | 欧美日韩在线精品 | 久久国产成人午夜av影院武则天 | 国产精品一区在线 | 国产激情视频网 | eeuss国产一区二区三区四区 | 99热这里有精品 | 久久精品国产亚洲一区二区 | 久久久久9999亚洲精品 | 一区二区三区四区免费视频 | 久久精品99 | 久久久新视频 | 国产一区二区三区在线免费 | 久久人人国产 | 亚洲精品中文字幕在线 | 亚洲欧美日韩电影 | 成人精品视频99在线观看免费 | 亚洲精品久久久久久久久久吃药 | 亚洲精品欧美精品 | 中文字幕一区二区三区四区五区 | 香蕉婷婷 | 高清色 | 一级做受毛片免费大片 | 国产精品自产拍在线观看蜜 | 国产成人黄色 |