乾貨分享:18道Spring面試題

陝西優就業發表於2019-11-04

Spring 是個java企業級應用的開源開發框架。Spring主要用來開發Java應用,但是有些擴充套件是針對構建J2EE平臺的web應用。Spring 框架目標是簡化Java企業級應用開發,並透過POJO為基礎的程式設計模型促進良好的程式設計習慣。

今天 陝西優就業小編就給大家分享一篇高頻面試題,希望對大家有幫助。

一、什麼是Spring框架?Spring框架有哪些主要模組?

Spring框架是一個為Java應用程式的開發提供了綜合、廣泛的基礎性支援的Java平臺。Spring幫助開發者解決了開發中基礎性的問題,使得開發人員可以專注於應用程式的開發。

Spring框架本身亦是按照設計模式精心打造,這使得我們可以在開發環境中安心的整合Spring框架,不必擔心Spring是如何在後臺進行工作的。

Spring框架至今已整合了20多個模組。這些模組主要被分如下圖所示的核心容器、資料訪問/整合,、Web、AOP(面向切面程式設計)、工具、訊息和測試模組。

二、使用Spring框架能帶來哪些好處?

下面列舉了一些使用Spring框架帶來的主要好處:

1、Dependency Injection(DI) 方法使得構造器和JavaBean properties檔案中的依賴關係一目瞭然。

2、與EJB容器相比較,IoC容器更加趨向於輕量級。這樣一來IoC容器在有限的記憶體和CPU資源的情況下進行應用程式的開發和釋出就變得十分有利。

3、Spring並沒有閉門造車,Spring利用了已有的技術比如ORM框架、logging框架、J2EE、Quartz和JDK Timer,以及其他檢視技術。

4、Spring框架是按照模組的形式來組織的。由包和類的編號就可以看出其所屬的模組,開發者僅僅需要選用他們需要的模組即可。

5、要測試一項用Spring開發的應用程式十分簡單,因為測試相關的環境程式碼都已經囊括在框架中了。更加簡單的是,利用JavaBean形式的POJO類,可以很方便的利用依賴注入來寫入測試資料。

6、Spring的Web框架亦是一個精心設計的Web MVC框架,為開發者們在web框架的選擇上提供了一個除了主流框架比如Struts、過度設計的、不流行web框架的以外的有力選項。

7、Spring提供了一個便捷的事務管理介面,適用於小型的本地事物處理(比如在單DB的環境下)和複雜的共同事物處理(比如利用J他的複雜DB環境)。

三、什麼是控制反轉(IOC)?什麼是依賴注入?

1、控制反轉是應用於軟體工程領域中的,在執行時被裝配器物件來繫結耦合物件的一種程式設計技巧,物件之間耦合關係在編譯時通常是未知的。

在傳統的程式設計方式中,業務邏輯的流程是由應用程式中的早已被設定好關聯關係的物件來決定的。

在使用控制反轉的情況下,業務邏輯的流程是由物件關係圖來決定的,該物件關係圖由裝配器負責例項化,這種實現方式還可以將物件之間的關聯關係的定義抽象化。而繫結的過程是透過“依賴注入”實現的。

2、控制反轉是一種以給予應用程式中目標元件更多控制為目的設計正規化,並在我們的實際工作中起到了有效的作用。

3、依賴注入是在編譯階段尚未知所需的功能是來自哪個的類的情況下,將其他物件所依賴的功能物件例項化的模式。

這就需要一種機制用來啟用相應的元件以提供特定的功能,所以依賴注入是控制反轉的基礎。否則如果在元件不受框架控制的情況下,框架又怎麼知道要建立哪個元件?

4、在Java中依然注入有以下三種實現方式:

1)構造器注入;

2)Setter方法注入;

3)介面注入;

四、請解釋下Spring框架中的IoC?

Spring中的 org.springframework.beans 包和 org.springframework.context包構成了Spring框架IoC容器的基礎。

BeanFactory介面提供了一個先進的配置機制,使得任何型別的物件的配置成為可能。ApplicationContex介面對BeanFactory(是一個子介面)進行了擴充套件.

在BeanFactory的基礎上新增了其他功能,比如與Spring的AOP更容易整合,也提供了處理message resource的機制(用於國際化)、事件傳播以及應用層的特別配置,比如針對Web應用的WebApplicationContext。

五、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在此基礎上還提供了其他的功能:

1)提供了支援國際化的文字訊息;

2)統一的資原始檔讀取方式;

3)已在監聽器中註冊的bean的事件;

六、Spring有幾種配置方式?

將Spring配置到應用開發中有以下三種方式:

1)基於XML的配置

2)基於註解的配置

3)基於Java的配置

七、如何用基於XML配置的方式配置Spring?

在Spring框架中,依賴和服務需要在專門的配置檔案來實現,我常用的XML格式的配置檔案。這些配置檔案的格式通常用開頭,然後一系列的bean定義和專門的應用配置選項組成。

SpringXML配置的主要目的時候是使所有的Spring元件都可以用xml檔案的形式來進行配置。這意味著不會出現其他的Spring配置型別(比如宣告的方式或基於Java Class的配置方式)

Spring的XML配置方式是使用被Spring名稱空間的所支援的一系列的XML標籤來實現的。Spring有以下主要的名稱空間:context、beans、jdbc、tx、aop、mvc和aso。

八、怎樣用註解的方式配置Spring?

Spring在2.5版本以後開始支援用註解的方式來配置依賴注入。可以用註解的方式來替代XML方式的bean描述,可以將bean描述轉移到元件類的內部,只需要在相關類上、方法上或者欄位宣告上使用註解即可。

註解注入將會被容器在XML注入之前被處理,所以後者會覆蓋掉前者對於同一個屬性的處理結果。

註解裝配在Spring中是預設關閉的。所以需要在Spring檔案中配置一下才能使用基於註解的裝配模式。如果你想要在你的應用程式中使用關於註解的方法的話,請參考如下的配置。

在 標籤配置完成以後,就可以用註解的方式在Spring中向屬性、方法和構造方法中自動裝配變數。

下面是幾種比較重要的註解型別:

1)@Required:該註解應用於設值方法。

2)@Autowired:該註解應用於有值設值方法、非設值方法、構造方法和變數。

3)@Qualifier:該註解和@Autowired註解搭配使用,用於消除特定bean自動裝配的歧義。

4)JSR-250 Annotations:Spring支援基於JSR-250 註解的以下註解,@Resource、@PostConstruct 和 @PreDestroy。

九、請解釋Spring Bean的生命週期

Spring Bean的生命週期簡單易懂。在一個bean例項被初始化時,需要執行一系列的初始化操作以達到可用的狀態。

同樣的,當一個bean不在被呼叫時需要進行相關的析構操作,並從bean容器中移除。

Spring bean factory 負責管理在spring容器中被建立的bean的生命週期。Bean的生命週期由兩組回撥(call back)方法組成。

1)初始化之後呼叫的回撥方法。

2)銷燬之前呼叫的回撥方法。

Spring框架提供了以下四種方式來管理bean的生命週期事件:

1)InitializingBean和DisposableBean回撥介面

2)針對特殊行為的其他Aware介面

3)Bean配置檔案中的Custom init()方法和destroy()方法

4)@PostConstruct和@PreDestroy註解方式

使用customInit()和 customDestroy()方法管理bean生命週期的程式碼樣例如下:

十、Spring Bean的作用域之間有什麼區別?

Spring容器中的bean可以分為5個範圍。所有範圍的名稱都是自說明的,但是為了避免混淆,還是讓我們來解釋一下:

1)singleton:這種bean範圍是預設的,這種範圍確保不管接受到多少個請求,每個容器中只有一個bean的例項,單例的模式由bean factory自身來維護。

2)prototype:原形範圍與單例範圍相反,為每一個bean請求提供一個例項。

3)request:在請求bean範圍內會每一個來自客戶端的網路請求建立一個例項,在請求完成以後,bean會失效並被垃圾回收器回收。

4)Session:與請求範圍類似,確保每個session中有一個bean的例項,在session過期後,bean會隨之失效。

5)global-session:global-session和Portlet應用相關。當你的應用部署在Portlet容器中工作時,它包含很多portlet。如果你想要宣告讓所有的portlet共用全域性的儲存變數的話,那麼這全域性變數需要儲存在global-session中。

全域性作用域與Servlet中的session作用域效果相同。

十一、什麼是Spring beans?

Spring beans 是那些形成Spring應用的主幹的java物件。它們被Spring IOC容器初始化,裝配,和管理。這些beans透過容器中配置的後設資料建立。比如,以XML檔案中的形式定義。

Spring 框架定義的beans都是單件beans。在bean tag中有個屬性”singleton”,如果它被賦為TRUE,bean 就是單件,否則就是一個 prototype bean。預設是TRUE,所以所有在Spring框架中的beans 預設都是單件。

十二、解釋Spring支援的幾種bean的作用域

Spring框架支援以下五種bean的作用域:

1)singleton : bean在每個Spring ioc 容器中只有一個例項。

2)prototype:一個bean的定義可以有多個例項。

3)request:每次http請求都會建立一個bean,該作用域僅在基於web的Spring ApplicationContext情形下有效。

4)session:在一個HTTP Session中,一個bean定義對應一個例項。該作用域僅在基於web的Spring ApplicationContext情形下有效。

5)global-session:在一個全域性的HTTP Session中,一個bean定義對應一個例項。該作用域僅在基於web的Spring ApplicationContext情形下有效。

預設的Spring bean 的作用域是Singleton。

十三、解釋Spring框架中bean的生命週期

Spring容器 從XML 檔案中讀取bean的定義,並例項化bean。

Spring根據bean的定義填充所有的屬性。

如果bean實現了BeanNameAware 介面,Spring 傳遞bean 的ID 到 setBeanName方法。

如果Bean 實現了 BeanFactoryAware 介面, Spring傳遞beanfactory 給setBeanFactory 方法。

如果有任何與bean相關聯的BeanPostProcessors,Spring會在postProcesserBeforeInitialization()方法內呼叫它們。

如果bean實現IntializingBean了,呼叫它的afterPropertySet方法,如果bean宣告瞭初始化方法,呼叫此初始化方法。

如果有BeanPostProcessors 和bean 關聯,這些bean的postProcessAfterInitialization() 方法將被呼叫。

如果bean實現了 DisposableBean,它將呼叫destroy()方法。

十四、哪些是重要的bean生命週期方法? 你能過載它們嗎?

有兩個重要的bean 生命週期方法,第一個是setup , 它是在容器載入bean的時候被呼叫。第二個方法是 teardown 它是在容器解除安裝類的時候被呼叫。

The bean 標籤有兩個重要的屬性(init-method和destroy-method)。用它們你可以自己定製初始化和登出方法。它們也有相應的註解(@PostConstruct和@PreDestroy)。

十五、什麼是Spring的內部bean?

當一個bean僅被用作另一個bean的屬性時,它能被宣告為一個內部bean,為了定義inner bean,在Spring 的 基於XML的 配置後設資料中,可以在或 元素內使用元素,內部bean通常是匿名的,它們的Scope一般是prototype。

十六、在 Spring中如何注入一個java集合?

Spring提供以下幾種集合的配置元素:

型別用於注入一列值,允許有相同的值。

型別用於注入一組值,不允許有相同的值。

型別用於注入一組鍵值對,鍵和值都可以為任意型別。

型別用於注入一組鍵值對,鍵和值都只能為String型別。

十七、什麼是bean裝配?

裝配,或bean 裝配是指在Spring 容器中把bean組裝到一起,前提是容器需要知道bean的依賴關係,如何透過依賴注入來把它們裝配到一起。

十八、什麼是bean的自動裝配?

Spring 容器能夠自動裝配相互合作的bean,這意味著容器不需要和配置,能透過Bean工廠自動處理bean之間的協作。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69902581/viewspace-2662511/,如需轉載,請註明出處,否則將追究法律責任。

相關文章