Spring IOC相關面試題


SpringIOC相關知識點整理了一遍,要想知道哪些知識點是比較重要的。很簡單,我們去找找相關的面試題就知道了,如果該面試題是常見的,那么說明這個知識點還是相對比較重要的啦!

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 異常。

3Spring由哪些模塊組成?

簡單可以分成6大模塊:

  • Core
  • AOP
  • ORM
  • DAO
  • Web
  • Spring EE

4BeanFactory 實現舉例

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

spring3.2之前最常用的是XmlBeanFactory的,但現在被廢棄了,取而代之的是:XmlBeanDefinitionReader和DefaultListableBeanFactory

5什么是Spring的依賴注入?

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

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

  • 構造器依賴注入:構造器依賴注入通過容器觸發一個類的構造器來實現的,該類有一系列參數,每個參數代表一個對其他類的依賴。
  • Setter方法注入Setter方法注入是容器通過調用無參構造器或無參static工廠 方法實例化bean之后,調用該bean的setter方法,即實現了基於setter的依賴注入。
  • 工廠注入:這個是遺留下來的,很少用的了!

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

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

8什么是Spring beans?

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

這里有四種重要的方法給Spring容器提供配置元數據

  • XML配置文件。
  • 基於注解的配置。
  • 基於java的配置。
  • Groovy DSL配置

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

10解釋不同方式的自動裝配

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

只用注解的方式時,注解默認是使用byType的

11IOC的優點是什么?

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

12哪些是重要的bean生命周期方法? 你能重載它們嗎?

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

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

13怎么回答面試官:你對Spring的理解?

14Spring框架中的單例Beans是線程安全的么?

Spring框架並沒有對單例bean進行任何多線程的封裝處理。關於單例bean的線程安全和並發問題需要開發者自行去搞定。但實際上,大部分的Spring bean並沒有可變的狀態(比如Serview類和DAO類),所以在某種程度上說Spring的單例bean是線程安全的。如果你的bean有多種狀態的話(比如 View Model 對象),就需要自行保證線程安全

最淺顯的解決辦法就是將多態bean的作用域由“singleton”變更為“prototype”

15FileSystemResourceClassPathResource有何區別?

FileSystemResource 中需要給出spring-config.xml文件在你項目中的相對路徑或者絕對路徑。在ClassPathResource中spring會在ClassPath中自動搜尋配置文件,所以要把ClassPathResource文件放在ClassPath下。

如果將spring-config.xml保存在了src文件夾下的話,只需給出配置文件的名稱即可,因為src文件夾是默認。

簡而言之,ClassPathResource在環境變量中讀取配置文件,FileSystemResource在配置文件中讀取配置文件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM