將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-method和destroy-method)。用它們你可以自己定制初始化和注銷方法。它們也有相應的注解(@PostConstruct和@PreDestroy)。
13怎么回答面試官:你對Spring的理解?
14Spring框架中的單例Beans是線程安全的么?
Spring框架並沒有對單例bean進行任何多線程的封裝處理。關於單例bean的線程安全和並發問題需要開發者自行去搞定。但實際上,大部分的Spring bean並沒有可變的狀態(比如Serview類和DAO類),所以在某種程度上說Spring的單例bean是線程安全的。如果你的bean有多種狀態的話(比如 View Model 對象),就需要自行保證線程安全。
最淺顯的解決辦法就是將多態bean的作用域由“singleton”變更為“prototype”
15FileSystemResource和ClassPathResource有何區別?
在FileSystemResource 中需要給出spring-config.xml文件在你項目中的相對路徑或者絕對路徑。在ClassPathResource中spring會在ClassPath中自動搜尋配置文件,所以要把ClassPathResource文件放在ClassPath下。
如果將spring-config.xml保存在了src文件夾下的話,只需給出配置文件的名稱即可,因為src文件夾是默認。
簡而言之,ClassPathResource在環境變量中讀取配置文件,FileSystemResource在配置文件中讀取配置文件。