2019年一線大廠春招:Spring面試題和答案合集(上篇)

1. 什麼是spring?java

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

2. 使用Spring框架的好處是什麼?面試

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

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

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

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

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

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

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

3. Spring由哪些模塊組成?

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

Core moduleBean moduleContext moduleExpression Language moduleJDBC moduleORM moduleOXM moduleJava Messaging Service(JMS) moduleTransaction moduleWeb moduleWeb-Servlet moduleWeb-Struts moduleWeb-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的支持。

11. Spring配置文件

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

12. 什麼是Spring IOC 容器?

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

13. 你能夠在Spring中注入一個null 和一個空字符串嗎?

能夠。

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方法實現可選依賴。

21.什麼是Spring beans?

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

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. 你怎樣定義類的做用域?

當定義一個<bean> 在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的 配置元數據中,能夠在 <property/>或 <constructor-arg/> 元素內使用<bean/> 元素,內部bean一般是匿名的,它們的Scope通常是prototype。

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

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

<list>類型用於注入一列值,容許有相同的值。

<set> 類型用於注入一組值,不容許有相同的值。

<map> 類型用於注入一組鍵值對,鍵和值均可覺得任意類型。

<props>類型用於注入一組鍵值對,鍵和值都只能爲String類型。

31. 什麼是bean裝配?

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

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

Spring 容器可以自動裝配相互合做的bean,這意味着容器不須要<constructor-arg>和<property>配置,能經過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.自動裝配有哪些侷限性 ?

自動裝配的侷限性是:

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

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

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

最後福利:

上面大廠的面試答案和更多的大廠真題小編也整理了在一塊兒,同時還準備了一份架構進階視頻資料

歡迎工做一到五年的Java工程師朋友們加入Java高級架構:705127209

羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,

MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)

合理利用本身每一分每一秒的時間來學習提高本身,不要再用"沒有時間「來掩飾本身思想上的懶惰!趁年輕,使勁拼,給將來的本身一個交代!

 

相關文章
相關標籤/搜索