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中依賴注入兩種方式的認識
兩種注入方式為:構造方法注入和設值注入
-
設值注入與傳統的JavaBean的寫法更相似,程式設計師更容易理解、接受,通過setter方式設定依賴關係顯得更加直觀、明顯;
-
對於複雜的依賴關係,如果採用構造注入,會導致構造器過於臃腫,難以閱讀。Spring在建立Bean例項時,需要同時例項化其依賴的全部例項,因而會產生浪費。而使用設定注入,則避免這下問題;
-
在某些屬性可選的情況下,多引數的構造器更加笨拙,官方更鼓勵使用設值注入。
-
構造注入可以在構造器中決定依賴關係的注入順序,優先依賴的優先注入。
-
對於依賴關係無須變化的Bean,構造注入更有用處,因為沒有setter方法,所有的依賴關係全部在構造器內設定,因此,不用擔心後續程式碼對依賴關係的破壞。
-
構造注入使依賴關係只能在構造器中設定,則只有元件的建立者才能改變元件的依賴關係。對元件的呼叫者而言,元件內部的依賴關係完全透明,更符合高內聚的原則。
-
設值注入不會重寫構造方法的值。如果我們對同一個變數同時使用了構造方法注入又使用了設定方法注入的話,那麼構造方法將不能覆蓋由設值方法注入的值。
-
建議採用以設值注入為主,構造注入為輔的注入策略。對於依賴關係無須變化的注入,儘量採用構造注入;而其他的依賴關係的注入,則考慮採用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配置檔案中的錯誤,壞處是造成浪費。