歡迎光臨
每天分享高質量文章

Spring 面試題及答案解析(7)

點選上方“芋道原始碼”,選擇“置頂公眾號”

技術文章第一時間送達!

原始碼精品專欄

 

這一篇說一些Java最流行的框架spring的一些知識點。大家註意到了沒有,我不說面試題,改用知識點了。因為後臺有小夥伴留言說有很多人不準備面試,可不可以發一些學習的知識點。


其實面試所問的往往是企業期望技術人掌握的東西,這些不一定只是為了去面試看,透過看這些問題反省自己對某一塊知識的掌握也是很好的。但小編還是想儘量滿足大部分小夥伴的想法,所以以後發的面試題一律改稱知識點。以下是知識點正文:

說一下spring中Bean的作用域

singleton:

    Spring IoC容器中只會存在一個共享的Bean實體,無論有多少個Bean取用它,始終指向同一物件。Singleton作用域是Spring中的預設作用域。

prototype:

    每次透過Spring容器獲取prototype定義的bean時,容器都將建立一個新的Bean實體,每個Bean實體都有自己的屬性和狀態,而singleton全域性只有一個物件。

request:

    在一次Http請求中,容器會傳回該Bean的同一實體。而對不同的Http請求則會產生新的Bean,而且該bean僅在當前Http Request內有效。

session:

    在一次Http Session中,容器會傳回該Bean的同一實體。而對不同的Session請求則會建立新的實體,該bean實體僅在當前Session內有效。

global Session:

    在一個全域性的Http Session中,容器會傳回該Bean的同一個實體,僅在使用portlet context時有效。

說一下spring中Bean的生命週期


  • 實體化一個Bean,也就是我們通常說的new。

  • 按照Spring背景關係對實體化的Bean進行配置,也就是IOC註入。

  • 如果這個Bean實現了BeanNameAware介面,會呼叫它實現的setBeanName(String beanId)方法,此處傳遞的是Spring配置檔案中Bean的ID。

  • 如果這個Bean實現了BeanFactoryAware介面,會呼叫它實現的setBeanFactory(),傳遞的是Spring工廠本身(可以用這個方法獲取到其他Bean)。

  • 如果這個Bean實現了ApplicationContextAware介面,會呼叫setApplicationContext(ApplicationContext)方法,傳入Spring背景關係。

  • 如果這個Bean關聯了BeanPostProcessor介面,將會呼叫postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor經常被用作是Bean內容的更改,並且由於這個是在Bean初始化結束時呼叫After方法,也可用於記憶體或快取技術。

  • 如果這個Bean在Spring配置檔案中配置了init-method屬性會自動呼叫其配置的初始化方法。

  • 如果這個Bean關聯了BeanPostProcessor介面,將會呼叫postAfterInitialization(Object obj, String s)方法。

  • 當Bean不再需要時,會經過清理階段,如果Bean實現了DisposableBean介面,會呼叫其實現的destroy方法。

  • 最後,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動呼叫其配置的銷毀方法。

對Spring中依賴註入兩種方式的認識

兩種註入方式為:構造方法註入和設值註入

  1. 設值註入與傳統的JavaBean的寫法更相似,程式員更容易理解、接受,透過setter方式設定依賴關係顯得更加直觀、明顯;

  2. 對於複雜的依賴關係,如果採用構造註入,會導致建構式過於臃腫,難以閱讀。Spring在建立Bean實體時,需要同時實體化其依賴的全部實體,因而會產生浪費。而使用設定註入,則避免這下問題;

  3. 在某些屬性可選的情況下,多引數的建構式更加笨拙,官方更鼓勵使用設值註入。

  4. 構造註入可以在建構式中決定依賴關係的註入順序,優先依賴的優先註入。

  5. 對於依賴關係無須變化的Bean,構造註入更有用處,因為沒有setter方法,所有的依賴關係全部在建構式內設定,因此,不用擔心後續程式碼對依賴關係的破壞。

  6. 構造註入使依賴關係只能在建構式中設定,則只有元件的建立者才能改變元件的依賴關係。對元件的呼叫者而言,元件內部的依賴關係完全透明,更符合高內聚的原則。

  7. 設值註入不會重寫構造方法的值。如果我們對同一個變數同時使用了構造方法註入又使用了設定方法註入的話,那麼構造方法將不能改寫由設值方法註入的值。

  8. 建議採用以設值註入為主,構造註入為輔的註入策略。對於依賴關係無須變化的註入,儘量採用構造註入;而其他的依賴關係的註入,則考慮採用set註入。

Spring框架中都用到了哪些設計樣式?

  • 代理樣式:在AOP和remoting中被用的比較多。

  • 單例樣式:在spring配置檔案中定義的bean預設為單例樣式。

  • 模板方法樣式:用來解決程式碼重覆的問題。

  • 前端控制器樣式:Spring提供了DispatcherServlet來對請求進行分發。

  • 依賴註入樣式:貫穿於BeanFactory / ApplicationContext介面的核心理念。

  • 工廠樣式:BeanFactory用來建立物件的實體。

BeanFactory 和ApplicationContext的區別

BeanFactory和ApplicationContext都是介面,並且ApplicationContext是BeanFactory的子介面。

BeanFactory是Spring中最底層的介面,提供了最簡單的容器的功能,只提供了實體化物件和拿物件的功能。而ApplicationContext是Spring的一個更高階的容器,提供了更多的有用的功能。 

ApplicationContext提供的額外的功能:國際化的功能、訊息傳送、響應機制、統一載入資源的功能、強大的事件機制、對Web應用的支援等等。

載入方式的區別:BeanFactory採用的是延遲載入的形式來註入Bean;ApplicationContext則相反的,它是在Ioc啟動時就一次性建立所有的Bean,好處是可以馬上發現Spring配置檔案中的錯誤,壞處是造成浪費。


知識星球

目前在知識星球(https://t.zsxq.com/2VbiaEu)更新瞭如下 Dubbo 原始碼解析如下:

01. 除錯環境搭建
02. 專案結構一覽
03. API 配置(一)之應用
04. API 配置(二)之服務提供者
05. API 配置(三)之服務消費者
06. 屬性配置
07. XML 配置
08. 核心流程一覽

09. 拓展機制 SPI

10. 執行緒池


一共 60 篇++

贊(0)

分享創造快樂