??大家好,我是陳哈哈,北漂五年,相信大家和我一樣,
都有一個大廠夢,作為一名資深Java選手,深知面試重要性,接下來我準備用100天時間,基于Java崗面試中的高頻面試題,以每日3題的形式,帶你過一遍熱門面試題及恰如其分的解答,
??一路走來,隨著問題加深,發現不會的也愈來愈多,但底氣著實足了不少,相信不少朋友和我一樣,榷訓月累才是最有效的學習方式!想起高三時一個同學的座右銘:只有沉下去,才能浮上來,共勉(juan),

作者:對你何止一句鐘意
車票
- 面試題1:Bean 的加載程序是怎樣的?
- 追問1:什么是回圈依賴?
- 追問2:回圈依賴得解決思路是什么樣的?
- 面試題2:@Resource和@Autowired有什么區別?
- 面試題3:Spring 的事務傳播行為有哪些,都有什么作用?
- 每日小結
??本欄目Java開發崗高頻面試題主要出自以下各技術堆疊:Java基礎知識、集合容器、并發編程、JVM、Spring全家桶、MyBatis等ORMapping框架、MySQL資料庫、Redis快取、RabbitMQ訊息佇列、Linux操作技巧等,
面試題1:Bean 的加載程序是怎樣的?
我們知道, Spring 的作業流主要包括以下兩個環節:
決議,讀 xml 配置,掃描類檔案,從配置或者注解中獲取 Bean 的定義資訊,注冊一些擴展功能,加載,通過決議完的定義資訊獲取 Bean 實體,
??下面是跟蹤了 getBean的呼叫鏈創建的流程圖,為了能夠很好地理解 Bean 加載流程,省略一些例外、日志和分支處理和一些特殊條件的判斷,

從上面的流程圖中,可以看到一個 Bean 加載主要會經歷這么幾個階段(標綠內容):
獲取 BeanName,對傳入的 name 進行決議,轉化為可以從 Map 中獲取到 BeanDefinition 的 bean name,合并 Bean 定義,對父類的定義進行合并和覆寫,如果父類還有父類,會進行遞回合并,以獲取完整的 Bean 定義資訊,實體化,使用構造或者工廠方法創建 Bean 實體,屬性填充,尋找并且注入依賴,依賴的 Bean 還會遞回呼叫 getBean 方法獲取,初始化,呼叫自定義的初始化方法,獲取最終的 Bean,如果是 FactoryBean 需要呼叫 getObject 方法,如果需要型別轉換呼叫 TypeConverter 進行轉化,
以上便是Spring對bean決議注冊的全程序,總結一下大致步驟:
- 加載XML檔案,封裝成Resource物件;
- 呼叫Reader物件方法讀取XML檔案內容,并將相關屬性放到BeanDefinition實體;
- 將BeanDefinition物件放到BeanFactory物件,用于呼叫;
追問1:什么是回圈依賴?
??舉個例子,這里有三個類 A、B、C,然后 A 關聯 B,B 關聯 C,C 又關聯 A,這就形成了一個回圈依賴,如果是方法呼叫是不算回圈依賴的,回圈依賴必須要持有參考,

回圈依賴發生的場景:
構造器回圈依賴:依賴的物件是通過構造器傳入的,發生在實體化 Bean 的時候,設值回圈依賴:依賴的物件是通過 setter 方法傳入的,物件已經實體化,發生屬性填充和依賴注入的時候,
??如果是構造器回圈依賴,本質上是無法解決的,比如我們準呼叫 A 的構造器,發現依賴 B,于是去呼叫 B 的構造器進行實體化,發現又依賴 C,于是呼叫 C 的構造器去初始化,結果依賴 A,整個形成一個死結,導致 A 無法創建,
??如果是設值回圈依賴,Spring 框架只支持單例下的設值回圈依賴,Spring 通過對還在創建程序中的單例,快取并提前暴露該單例,使得其他實體可以參考該依賴,
追問2:回圈依賴得解決思路是什么樣的?
??Spring解決回圈依賴,主要的思路就是依據三級快取(解鏈),
??在實體化A時呼叫doGetBean,發現A依賴的B的實體,此時呼叫doGetBean去實體B,實體化的B的時候發現又依賴A,如果不解決這個回圈依賴的話此時的doGetBean將會無限回圈下去,導致記憶體溢位,程式奔潰,
??如果Spring參考一個早期物件,并且把這個"早期參考"并將其注入到容器中,讓B先完成實體化,此時A就獲取B的參考,完成實體化,
一級快取:singletonObjects,存放完全實體化屬性賦值完成的Bean,直接可以使用,
二級快取:earlySingletonObjects,存放早期Bean的參考,尚未屬性裝配的Bean
三級快取:singletonFactories,三級快取,存放實體化完成的Bean工廠,

課間休息,來秀一下新加入的一名家庭成員,小哈!來的第二天睡覺就如此妖嬈了么~
面試題2:@Resource和@Autowired有什么區別?
@Autowired根據型別注入@Resource默認根據名字注入,其次按照型別搜索@Autowired @Qualifie("userService")兩個結合起來可以根據名字和型別注入,等同于@Resource
-
@Autowired與@Resource都可以用來裝配bean. 都可以寫在欄位上,或寫在setter方法上,
-
@Autowired默認按型別裝配(byType),默認情況下必須要求依賴物件必須存在,如果要允許null值,可以設定它的required屬性為false,如:
@Autowired(required=false),如果我們想使用名稱裝配可以結合@Qualifier注解進行使用(@Autowired () @Qualifier ( "xxx" )功能同@Resource),如下:
@Autowired
@Qualifier ( "userDao" )
private UserDao userDao;
- @Resource默認按照名稱進行裝配(byName),名稱可以通過name屬性進行指定,如果沒有指定name屬性,當注解寫在欄位上時,默認取欄位名進行安裝名稱查找,如果注解寫在setter方法上默認取屬性名進行裝配,當找不到與名稱匹配的bean時才按照型別進行裝配,
如果name屬性一旦指定,就只會按照名稱進行裝配,
@Resource (name= "baseDao" )
private BaseDao baseDao;
總結如下:
- @Autowired默認按byType自動裝配,而@Resource默認byName自動裝配,
- @Autowired只包含一個引數:required,表示是否開啟自動注入,默認是true,而@Resource包含七個引數,其中最重要的兩個引數是:name 和 type,
- @Autowired如果要使用byName,需要使用@Qualifier一起配合,而@Resource如果指定了name,則用byName自動裝配,如果指定了type,則用byType自動裝配,
- @Autowired能夠用在:
構造器、方法、引數、成員變數和注解上,而@Resource能用在:類、成員變數和方法上, - @Autowired是spring定義的注解,而@Resource是JSR-250定義的注解,

課間休息,又來秀一下來自咱們群里同學的搬磚工地,坐標:大連,
作者:Onlooker
面試題3:Spring 的事務傳播行為有哪些,都有什么作用?
??簡單來講,就是當系統中存在兩個事務方法時(我們暫稱為方法A和方法B),如果方法B在方法A中被呼叫,那么將采用什么樣的事務形式,就叫做事務的傳播特性
??比如,A方法呼叫了B方法(B方法必須使用事務注解),那么B事務可以是一個在A中嵌套的事務,或者B事務不使用事務,又或是使用與A事務相同的事務,這些均可以通過指定事務傳播特性來實作,
| 傳播行為 | 意義 |
|---|---|
| propagation.REQUIRED | 表示當前方法必須運行在事務中,如果當前事務存在,方法將會在該事務中運行,否則會啟動一個新的事務 |
| propagation.SUPPORTS | 表示當前方法不需要事務背景關系,但是如果存在當前事務的話,那么該方法會在這個事務中運行 |
| propagation.MANDATORY | 表示該方法必須在事務中運行,如果當前事務不存在,則會拋出一個例外 |
| propagation.REQUIRED_NEW | 表示當前方法必須運行在它自己的事務中,一個新的事務將被啟動,如果存在當前事務,在該方法執行期間,當前事務會被掛起,如果使用JTATransactionManager的話,則需要訪問TransactionManager |
| propagation.NOT_SUPPORTED | 表示該方法不應該運行在事務中,如果存在當前事務,在該方法運行期間,當前事務將被掛起,如果使用JTATransactionManager的話,則需要訪問TransactionManager |
| propagation.NEVER | 表示當前方法不應該運行在事務背景關系中,如果當前正有一個事務在運行,則會拋出例外 |
| propagation.NESTED | 表示如果當前已經存在一個事務,那么該方法將會在嵌套事務中運行,嵌套的事務可以獨立于當前事務進行單獨地提交或回滾,如果當前事務不存在,那么其行為與propagation.REQUIRED一樣,注意各廠商對這種傳播行為的支持是有所差異的,可以參考資源管理器的檔案來確認它們是否支持嵌套事務 |
每日小結
??今天我們復習了面試中常考的Spring框架相關的三個問題,你做到心中有數了么?對了,如果你的朋友也在準備面試,請將這個系列扔給他,如果他認真對待,肯定會感謝你的!!好了,今天就到這里,學廢了的同學,記得在評論區留言:打卡,,給同學們以激勵,
參考資料:
https://www.zhihu.com/question/39356740
https://www.jianshu.com/p/9ea61d204559
https://baijiahao.baidu.com/s?id=1593192556844228644&wfr=spider&for=pc
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/289571.html
標籤:java
