1. 程式人生 > >spring面試題(二)

spring面試題(二)

目錄

 

依賴注入方面

1.什麼是Spring的依賴注入

2.有哪些不同型別的IOC(依賴注入)方式

3.哪種依賴注入方式你建議使用,構造器注入,還是 Setter方法注入

Spring beans方面

1.什麼是Spring beans?

2. 一個 Spring Bean 定義 包含什麼?

3. 如何給Spring 容器提供配置元資料?

4. 你怎樣定義類的作用域? 

5. 解釋Spring支援的幾種bean的作用域。

6. Spring框架中的單例bean是執行緒安全的嗎?

7. 解釋Spring框架中bean的生命週期。

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

9. 什麼是Spring的內部bean?

10. 在 Spring中如何注入一個java集合?

11. 什麼是bean裝配? 

12. 什麼是bean的自動裝配?

13. 解釋不同方式的自動裝配 。

14.自動裝配有哪些侷限性 ?

35. 你可以在Spring中注入一個null 和一個空字串嗎?


依賴注入方面

1.什麼是Spring的依賴注入

依賴注入,是IOC的一個方面,是個通常的概念,它有多種解釋。

這概念是說你不用建立物件,而只需要描述它如何被建立。

你不在程式碼裡直接組裝你的元件和服務,但是要在配置檔案裡描述哪些元件需要哪些服務,之後一個容器(IOC容器)負責把他們組裝起來

 

2.有哪些不同型別的IOC(依賴注入)方式

構造器依賴注入:構造器依賴注入通過容器觸發一個類的構造器來實現的,該類有一系列引數,每個引數代表一個對其他類的依賴。

Setter方法注入:Setter方法注入是容器通過呼叫無參構造器或無參static工廠 方法例項化bean之後,呼叫該bean的setter方法,即實現了基於setter的依賴注入

 

3.哪種依賴注入方式你建議使用,構造器注入,還是 Setter方法注入

你兩種依賴方式都可以使用,構造器注入和Setter方法注入。最好的解決方案是用構造器引數實現強制依賴,setter方法實現可選依賴

 

Spring beans方面

1.什麼是Spring beans?

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

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

 

2. 一個 Spring Bean 定義 包含什麼?

一個Spring Bean 的定義包含容器必知的所有配置元資料,包括如何建立一個bean,它的生命週期詳情及它的依賴。

 

3. 如何給Spring 容器提供配置元資料?

這裡有三種重要的方法給Spring 容器提供配置元資料。

XML配置檔案。

基於註解的配置。

基於java的配置。

 

4. 你怎樣定義類的作用域? 

當定義一個<bean> 在Spring裡,我們還能給這個bean宣告一個作用域。它可以通過bean 定義中的scope屬性來定義。

如,當Spring要在需要的時候每次生產一個新的bean例項,bean的scope屬性被指定為prototype。另一方面,一個bean每次使用的時候必須返回同一個例項,這個bean的scope 屬性 必須設為 singleton。

 

5. 解釋Spring支援的幾種bean的作用域。

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

  • singleton : bean在每個Spring ioc 容器中只有一個例項。
  • prototype:一個bean的定義可以有多個例項。
  • request:每次http請求都會建立一個bean,該作用域僅在基於web的Spring ApplicationContext情形下有效。
  • session:在一個HTTP Session中,一個bean定義對應一個例項。該作用域僅在基於web的Spring ApplicationContext情形下有效。
  • global-session:在一個全域性的HTTP Session中,一個bean定義對應一個例項。該作用域僅在基於web的Spring ApplicationContext情形下有效。

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

 

6. Spring框架中的單例bean是執行緒安全的嗎?

不,Spring框架中的單例bean不是執行緒安全的。用ThreadLocal來解決

 

7. 解釋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()方法。

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

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

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

 

9. 什麼是Spring的內部bean?

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

 

10. 在 Spring中如何注入一個java集合?

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

  • <list>型別用於注入一列值,允許有相同的值。
  • <set> 型別用於注入一組值,不允許有相同的值。
  • <map> 型別用於注入一組鍵值對,鍵和值都可以為任意型別。
  • <props>型別用於注入一組鍵值對,鍵和值都只能為String型別。

 

11. 什麼是bean裝配? 

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

 

12. 什麼是bean的自動裝配?

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

 

13. 解釋不同方式的自動裝配 。

有五種自動裝配的方式,可以用來指導Spring容器用自動裝配方式來進行依賴注入。

  • no:預設的方式是不進行自動裝配,通過顯式設定ref 屬性來進行裝配。
  • byName:通過引數名 自動裝配,Spring容器在配置檔案中發現bean的autowire屬性被設定成byname,之後容器試圖匹配、裝配和該bean的屬性具有相同名字的bean。
  • byType::通過引數型別自動裝配,Spring容器在配置檔案中發現bean的autowire屬性被設定成byType,之後容器試圖匹配、裝配和該bean的屬性具有相同型別的bean。如果有多個bean符合條件,則丟擲錯誤。
  • constructor:這個方式類似於byType, 但是要提供給構造器引數,如果沒有確定的帶引數的構造器引數型別,將會丟擲異常。
  • autodetect:首先嚐試使用constructor來自動裝配,如果無法工作,則使用byType方式。

​​​​​​​

14.自動裝配有哪些侷限性 ?

自動裝配的侷限性是:

  • 重寫: 你仍需用 <constructor-arg>和 <property> 配置來定義依賴,意味著總要重寫自動裝配。
  • 基本資料型別:你不能自動裝配簡單的屬性,如基本資料型別,String字串,和類。
  • 模糊特性:自動裝配不如顯式裝配精確,如果有可能,建議使用顯式裝配。

35. 你可以在Spring中注入一個null 和一個空字串嗎?

可以。