25個Spring面試題
本人收集了一些在大家在面試時被經常問及的關於Spring的主要問題,這些問題有可能在你下次面試時就會被問到。對於本文中未提及的Spring其他模組,我會單獨分享面試的問題和答案。
歡迎大家向我推薦你在面試過程中遇到關於Spring的問題。我會把大家推薦的問題新增到下面的Spring常用面試題清單中供大家參考。
問題清單:
1、什麼是Spring框架?Spring框架有哪些主要模組?
Spring框架是一個為Java應用程式的開發提供了綜合、廣泛的基礎性支援的Java平臺。Spring幫助開發者解決了開發中基礎性的問題,使得開發人員可以專注於應用程式的開發。Spring框架本身亦是按照
Spring框架至今已集成了20多個模組。這些模組主要被分如下圖所示的核心容器、資料訪問/整合,、Web、AOP(面向切面程式設計)、工具、訊息和測試模組。
2、使用Spring框架能帶來哪些好處?
下面列舉了一些使用Spring框架帶來的主要好處:
- Dependency Injection(DI) 方法使得構造器和JavaBean properties檔案中的依賴關係一目瞭然。
- 與EJB容器相比較,IoC容器更加趨向於輕量級。這樣一來IoC容器在有限的記憶體和CPU資源的情況下進行應用程式的開發和釋出就變得十分有利。
- Spring並沒有閉門造車,Spring利用了已有的技術比如ORM框架、logging框架、J2EE、Quartz和JDK Timer,以及其他檢視技術。
- Spring框架是按照模組的形式來組織的。由包和類的編號就可以看出其所屬的模組,開發者僅僅需要選用他們需要的模組即可。
- 要測試一項用Spring開發的應用程式十分簡單,因為測試相關的環境程式碼都已經囊括在框架中了。更加簡單的是,利用JavaBean形式的POJO類,可以很方便的利用依賴注入來寫入測試資料。
- Spring的Web框架亦是一個精心設計的Web MVC框架,為開發者們在web框架的選擇上提供了一個除了主流框架比如Struts、過度設計的、不流行web框架的以外的有力選項。
- Spring提供了一個便捷的事務管理介面,適用於小型的本地事物處理(比如在單DB的環境下)和複雜的共同事物處理(比如利用JTA的複雜DB環境)。
3、什麼是控制反轉(IOC)?什麼是依賴注入?
控制反轉是應用於軟體工程領域中的,在執行時被裝配器物件來繫結耦合物件的一種程式設計技巧,物件之間耦合關係在編譯時通常是未知的。在傳統的程式設計方式中,業務邏輯的流程是由應用程式中的早已被設定好關聯關係的物件來決定的。在使用控制反轉的情況下,業務邏輯的流程是由物件關係圖來決定的,該物件關係圖由裝配器負責例項化,這種實現方式還可以將物件之間的關聯關係的定義抽象化。而繫結的過程是通過“依賴注入”實現的。
控制反轉是一種以給予應用程式中目標元件更多控制為目的設計正規化,並在我們的實際工作中起到了有效的作用。
依賴注入是在編譯階段尚未知所需的功能是來自哪個的類的情況下,將其他物件所依賴的功能物件例項化的模式。這就需要一種機制用來啟用相應的元件以提供特定的功能,所以依賴注入是控制反轉的基礎。否則如果在元件不受框架控制的情況下,框架又怎麼知道要建立哪個元件?
在Java中依然注入有以下三種實現方式:
- 構造器注入
- Setter方法注入
- 介面注入
4、請解釋下Spring框架中的IoC?
Spring中的 org.springframework.beans
包和 org.springframework.context
包構成了
Spring
框架
IoC
容器的基礎。
BeanFactory 介面提供了一個先進的配置機制,使得任何型別的物件的配置成為可能。ApplicationContex
介面對
BeanFactory
(是一個子介面)進行了擴充套件,在BeanFactory的基礎上添加了其他功能,比如與Spring的AOP更容易整合,也提供了處理message
resource的機制(用於國際化)、事件傳播以及應用層的特別配置,比如針對Web應用的WebApplicationContext。
org.springframework.beans.factory.BeanFactory
是Spring IoC容器的具體實現,用來包裝和管理前面提到的各種bean。BeanFactory介面是Spring
IoC 容器的核心介面。
5、BeanFactory和ApplicationContext有什麼區別?
BeanFactory 可以理解為含有bean集合的工廠類。BeanFactory 包含了種bean的定義,以便在接收到客戶端請求時將對應的bean例項化。
BeanFactory還能在例項化物件的時生成協作類之間的關係。此舉將bean自身與bean客戶端的配置中解放出來。BeanFactory還包含了bean生命週期的控制,呼叫客戶端的初始化方法(initialization methods)和銷燬方法(destruction methods)。
從表面上看,application context如同bean factory一樣具有bean定義、bean關聯關係的設定,根據請求分發bean的功能。但application context在此基礎上還提供了其他的功能。
- 提供了支援國際化的文字訊息
- 統一的資原始檔讀取方式
- 已在監聽器中註冊的bean的事件
以下是三種較常見的 ApplicationContext 實現方式:
1、ClassPathXmlApplicationContext:從classpath的XML配置檔案中讀取上下文,並生成上下文定義。應用程式上下文從程式環境變數中取得。
1 |
ApplicationContext
context = new
ClassPathXmlApplicationContext(“bean.xml”);
|
2、FileSystemXmlApplicationContext :由檔案系統中的XML配置檔案讀取上下文。
1 |
ApplicationContext
context = new
FileSystemXmlApplicationContext(“bean.xml”);
|
3、XmlWebApplicationContext:由Web應用的XML檔案讀取上下文。
6、Spring有幾種配置方式?
將Spring配置到應用開發中有以下三種方式:
- 基於XML的配置
- 基於註解的配置
- 基於Java的配置
7、如何用基於XML配置的方式配置Spring?
在Spring框架中,依賴和服務需要在專門的配置檔案來實現,我常用的XML格式的配置檔案。這些配置檔案的格式通常用<beans>
開頭,然後一系列的
bean
定義和專門的應用配置選項組成。
SpringXML配置的主要目的時候是使所有的Spring元件都可以用xml檔案的形式來進行配置。這意味著不會出現其他的Spring配置型別(比如宣告的方式或基於Java Class的配置方式)
Spring的XML配置方式是使用被Spring名稱空間的所支援的一系列的XML標籤來實現的。Spring有以下主要的名稱空間:context、beans、jdbc、tx、aop、mvc和aso。
1 2 3 4 5 6 7 8 9 |
< beans >
<!--
JSON Support -->
< bean
name = "viewResolver"
class = "org.springframework.web.servlet.view.BeanNameViewResolver" />
< bean
name = "jsonTemplate"
class = "org.springframework.web.servlet.view.json.MappingJackson2JsonView" />
< bean
id = "restTemplate"
class = "org.springframework.web.client.RestTemplate" />
</ beans >
|
下面這個web.xml僅僅配置了DispatcherServlet,這件最簡單的配置便能滿足應用程式配置執行時元件的需求。