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

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

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

[[438671]]

前言

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

我們來看一下spring bean的定義,spring官方文檔對(duì)于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容器管理的對(duì)象稱為bean。bean是一個(gè)由Spring IoC容器實(shí)例化、組裝和管理的對(duì)象。

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

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

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

作用域

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

1、singleton:?jiǎn)卫饔糜?/p>

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

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

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

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

singleton:?jiǎn)卫饔糜?/p>

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

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

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

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

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

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

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

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

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

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

request:每次HTTP請(qǐng)求調(diào)用Bean時(shí),spring容器都會(huì)創(chuàng)建一個(gè)新的Bean

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

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

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

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

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

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

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

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

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

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

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

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

前置處理器

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

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

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

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

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

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

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

后置處理器

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

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

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

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

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

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

生命周期(加載過程)

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

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

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

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

1、實(shí)例化過程

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

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

4、銷毀過程

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

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

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

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

這一個(gè)方法真的很長(zhǎng),也是主要流程,簡(jiǎn)單看一下

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

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

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

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

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

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

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

 

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

2020-04-16 12:42:42

附近的人共享單車App

2020-08-12 09:55:07

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

2020-12-21 06:07:35

Mybatis設(shè)計(jì)模式

2020-03-31 08:12:25

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

2021-06-08 22:43:07

IPC方式Qt

2020-05-08 10:08:21

延時(shí)隊(duì)列APIDelayQueue

2025-05-14 01:55:00

FCMCPAI

2021-03-29 12:22:25

微信iOS蘋果

2020-11-04 14:20:58

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

2020-07-31 10:15:32

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

2020-09-24 09:08:04

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

2020-10-22 12:30:33

MySQL

2020-04-14 13:32:56

@Transacti失效場(chǎng)景

2023-12-18 23:09:25

開源優(yōu)化引擎

2024-01-29 00:29:49

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

2022-05-24 11:50:46

延時(shí)消息分布式

2021-05-18 09:03:16

Gomapslice

2021-01-04 11:23:21

手機(jī)無線電通訊

2021-03-01 18:52:39

工具在線瀏覽器

2024-03-26 09:42:27

分片算法應(yīng)用
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 精品国产一区二区国模嫣然 | 欧美一区二区在线观看 | 日韩精品免费在线观看 | 日韩中文久久 | 日韩精品成人免费观看视频 | 国产精品色哟哟网站 | av在线免费观看网址 | 国产一区二区视频在线 | 一级做a爰片性色毛片16美国 | 久久久久国产精品一区二区 | 国产一区二区在线免费 | 秋霞电影一区二区三区 | 免费欧美 | 成人精品国产一区二区4080 | 免费黄色录像视频 | 韩日一区二区 | 自拍偷拍亚洲一区 | 天天天操操操 | 中文字幕视频在线观看 | 国产精品中文字幕一区二区三区 | 毛片网站在线观看 | 国产美女永久免费无遮挡 | 亚洲综合一区二区三区 | 午夜在线精品 | 亚洲精彩视频 | 欧美精品一区三区 | 中文字幕一区二区三区四区 | 青青久在线视频 | 国产精品明星裸体写真集 | 日本免费视频在线观看 | 欧美日韩中文在线 | 夜夜爽夜夜操 | 亚洲永久入口 | 国产一级视频在线观看 | 日本三级视频 | 91亚洲精品久久久电影 | 欧美日韩一区二区在线观看 | 久久激情视频 | 中文字幕在线观看国产 | 国产乱码精品一区二区三区中文 | 天天干人人 |