Java面試-Spring IOC

1、什麼是 spring?

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

2、使用 Spring 框架的好處是什麼?

輕量:Spring 是輕量的,基本的版本大約 2MB。

控制反轉:Spring 通過控制反轉實現了鬆散耦合,對象們給出它們的依 賴,而不是創建或查找依賴的對象們。

面向切面的編程(AOP):Spring 支持面向切面的編程,並且把應用業務 邏輯和系統服務分開。

容器:Spring 包含並管理應用中對象的生命週期和配置。

MVC 框架:Spring 的 WEB 框架是個精心設計的框架,是 Web 框架的 一個很好的替代品。

事務管理:Spring 提供一個持續的事務管理接口,可以擴展到上至本地 事務下至全局事務(JTA)。

異常處理:Spring 提供方便的API把具體技術相關的異常(比如由JDBC, Hibernate or JDO 拋出的)轉化爲一致的 unchecked 異常。

3、Spring 由哪些模塊組成?

以下是 Spring 框架的基本模塊:

  •   Core module

  •   Bean module

  •   Context module

  •   Expression Language module

  •   JDBC module

  •   ORM module

  •   OXM module

  •   Java Messaging Service(JMS) module

  •   Transaction module

  •   Web module

  •   Web-Servlet module

  •   Web-Struts module

  •   Web-Portlet module

    4、核心容器(應用上下文) 模塊。

    這是基本的 Spring 模塊,提供 spring 框架的基礎功能,BeanFactory 是 任何 以 spring 爲基礎的應用的核心。Spring 框架建立在此模塊之上,它使 Spring 成 爲一個容器。

    5、BeanFactory – BeanFactory 實現舉例。

    Bean 工廠是工廠模式的一個實現,提供了控制反轉功能,用來把應用的配置和依 賴從正真的應用代碼中分離。

    最常用的 BeanFactory 實現是 XmlBeanFactory 類。

6、XMLBeanFactory

最常用的就是 org.springframework.beans.factory.xml.XmlBeanFactory ,它 根據 XML 文件中的定義加載 beans。該容器從 XML 文件讀取配置元數據並用它 去創建一個完全配置的系統或應用。

7、解釋 AOP 模塊

AOP 模塊用於發給我們的 Spring 應用做面向切面的開發, 很多支持由 AOP 聯 盟提供,這樣就確保了 Spring 和其他 AOP 框架的共通性。這個模塊將元數據編 程引入 Spring。

8、解釋 JDBC 抽象和 DAO 模塊。

通過使用 JDBC 抽象和 DAO 模塊,保證數據庫代碼的簡潔,並能避免數據庫資源 錯誤關閉導致的問題,它在各種不同的數據庫的錯誤信息之上,提供了一個統一 的異常訪問層。它還利用 Spring 的 AOP 模塊給 Spring 應用中的對象提供事務 管理服務。

9、解釋對象/關係映射集成模塊。

Spring 通過提供 ORM 模塊,支持我們在直接 JDBC 之上使用一個對象/關係映射 映射(ORM)工具,Spring 支持集成主流的 ORM 框架,如 Hiberate,JDO 和 iBATIS SQL Maps。Spring 的事務管理同樣支持以上所有 ORM 框架及 JDBC。

10、解釋 WEB 模塊。

Spring 的 WEB 模塊是構建在 application context 模塊基礎之上,提供一個適 合 web 應用的上下文。這個模塊也包括支持多種面向 web 的任務,如透明地處理 多個文件上傳請求和程序級請求參數的綁定到你的業務對象。它也有對 Jakarta Struts 的支持。

12、Spring 配置文件

Spring 配置文件是個 XML 文件,這個文件包含了類信息,描述瞭如何配置它們, 以及如何相互調用。

13、什麼是 Spring IOC 容器?

Spring IOC 負責創建對象,管理對象(通過依賴注入(DI),裝配對象,配置對 象,並且管理這些對象的整個生命週期。

14、IOC 的優點是什麼?

IOC 或 依賴注入把應用的代碼量降到最低。它使應用容易測試,單元測試不再需 要單例和 JNDI 查找機制。最小的代價和最小的侵入性使鬆散耦合得以實現。IOC 容器支持加載服務時的餓漢式初始化和懶加載。

15、ApplicationContext 通常的實現是什麼? FileSystemXmlApplicationContext :此容器從一個 XML 文件中加

載 beans 的定義,XML Bean 配置文件的全路徑名必須提供給它的構造函數。

ClassPathXmlApplicationContext:此容器也從一個 XML 文件中加 載 beans 的定義,這裏,你需要正確設置 classpath 因爲這個容器將在 classpath 裏找 bean 配置。

WebXmlApplicationContext:此容器加載一個 XML 文件,此文件定 義了一個 WEB 應用的所有 bean。

16、Bean 工廠和 Application contexts 有什麼區別?

Application contexts 提供一種方法處理文本消息,一個通常的做法是加載文件 資源(比如鏡像),它們可以向註冊爲監聽器的 bean 發佈事件。另外,在容器或 容器內的對象上執行的那些不得不由 bean 工廠以程序化方式處理的操作,可以在 Application contexts 中以聲明的方式處理。Application contexts 實現了 MessageSource 接口,該接口的實現以可插拔的方式提供獲取本地化消息的方 法。

17、一個 Spring 的應用看起來象什麼?

一個定義了一些功能的接口。
這實現包括屬性,它的 Setter , getter 方法和函數等。 Spring AOP。
Spring 的 XML 配置文件。 使用以上功能的客戶端程序。

依賴注入

18、什麼是 Spring 的依賴注入?

依賴注入,是 IOC 的一個方面,是個通常的概念,它有多種解釋。這概念是說你 不用創建對象,而只需要描述它如何被創建。你不在代碼裏直接組裝你的組件和 服務,但是要在配置文件裏描述哪些組件需要哪些服務,之後一個容器(IOC 容 器)負責把他們組裝起來。

19、有哪些不同類型的 IOC(依賴注入)方式?

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

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

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

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

Spring Beans
21.什麼是 Spring beans?

Spring beans 是那些形成 Spring 應用的主幹的 java 對象。它們被 Spring IOC 容器初始化,裝配,和管理。這些 beans 通過容器中配置的元數據創建。比如, 以 XML 文件中 的形式定義。

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

22、一個 Spring Bean 定義 包含什麼?

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

23、如何給 Spring 容器提供配置元數據?

這裏有三種重要的方法給 Spring 容器提供配置元數據。 XML 配置文件。
基於註解的配置。
基於 java 的配置。

24、你怎樣定義類的作用域?

當定義一個 在 Spring 裏,我們還能給這個 bean 聲明一個作用域。它可以通過 bean 定義中的 scope 屬性來定義。如,當 Spring 要在需要的時候每次生產一個 新的 bean 實例,bean 的 scope 屬性被指定爲 prototype。另一方面,一個 bean 每次使用的時候必須返回同一個實例,這個 bean 的 scope 屬性 必須設爲 singleton。

25、解釋 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.

26、Spring 框架中的單例 bean 是線程安全的嗎?

不,Spring 框架中的單例 bean 不是線程安全的。

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

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

有兩個重要的 bean 生命週期方法,第一個是 setup , 它是在容器加載 bean 的時候被調用。第二個方法是 teardown 它是在容器卸載類的時候被調用。

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

29、什麼是 Spring 的內部 bean?

當一個 bean 僅被用作另一個 bean 的屬性時,它能被聲明爲一個內部 bean,爲 了定義 inner bean,在 Spring 的 基於 XML 的 配置元數據中,可以在 或 元 素內使用 元素,內部 bean 通常是匿名的,它們的 Scope 一般是 prototype。

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

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

類型用於注入一列值,允許有相同的值。 類型用於注入一組值,不允許有相同的值。 類型用於注入一組鍵值對,鍵和值都可以爲任意類型。 類型用於注入一組鍵值對,鍵和值都只能爲 String 類型。

31、什麼是 bean 裝配?

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

32、什麼是 bean 的自動裝配?

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

33、解釋不同方式的自動裝配 。

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

no:默認的方式是不進行自動裝配,通過顯式設置 ref 屬性來進行裝配。

byName:通過參數名 自動裝配,Spring 容器在配置文件中發現 bean 的 autowire 屬性被設置成 byname,之後容器試圖匹配、裝配和該 bean 的屬 性具有相同名字的 bean。

byType::通過參數類型自動裝配,Spring 容器在配置文件中發現 bean 的 autowire 屬性被設置成 byType,之後容器試圖匹配、裝配和該 bean 的屬 性具有相同類型的 bean。如果有多個 bean 符合條件,則拋出錯誤。

constructor:這個方式類似於 byType, 但是要提供給構造器參數,如 果沒有確定的帶參數的構造器參數類型,將會拋出異常。

autodetect:首先嚐試使用 constructor 來自動裝配,如果無法工作, 則使用 byType 方式。

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

自動裝配的侷限性是:

重寫:你仍需用 和 配置來定義依賴,意味着總要重寫自動裝配。

基本數據類型:你不能自動裝配簡單的屬性,如基本數據類型,String 字符串,和類。

模糊特性:自動裝配不如顯式裝配精確,如果有可能,建議使用顯式裝配。

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

可以。

Spring 註解

36、什麼是基於 Java 的 Spring 註解配置? 給一些註解的例子.

基於 Java 的配置,允許你在少量的 Java 註解的幫助下,進行你的大部分 Spring 配置而非通過 XML 文件。

@Configuration 註解爲例,它用來標記類可以當做一個 bean 的定義,被 Spring IOC 容器使用。另一個例子是@Bean 註解,它表示此方法將要返回一個 對象,作爲一個 bean 註冊進 Spring 應用上下文。

37、什麼是基於註解的容器配置?

相對於 XML 文件,註解型的配置依賴於通過字節碼元數據裝配組件,而非尖括號 的聲明。

開發者通過在相應的類,方法或屬性上使用註解的方式,直接組件類中進行配置, 而不是使用 xml 表述 bean 的裝配關係。

38、怎樣開啓註解裝配?

註解裝配在默認情況下是不開啓的,爲了使用註解裝配,我們必須在 Spring 配置 文件中配置 context:annotation-config/元素。

39、@Required 註解

這個註解表明 bean 的屬性必須在配置的時候設置,通過一個 bean 定義的顯式的 屬性值或通過自動裝配,若@Required 註解的 bean 屬性未被設置,容器將拋出 BeanInitializationException。

40、@Autowired 註解

@Autowired 註解提供了更細粒度的控制,包括在何處以及如何完成自動裝配。 它的用法和@Required 一樣,修飾 setter 方法、構造器、屬性或者具有任意名稱 和/或多個參數的 PN 方法。

41、@Qualifier 註解
當有多個相同類型的 bean 卻只有一個需要自動裝配時,將@Qualifier 註解和

@Autowire 註解結合使用以消除這種混淆,指定需要裝配的確切的 bean。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章