JAVA關於Spring 面試題彙總

從事JAVA開發的給小夥伴都知道,Spring是java開發當中必不可少的一個框架,不論是面試、開發仍是工做當中,Spring的地位如今是獨樹一幟。好比如今SpringBoot,SpringColud等都是目前開發當中很火的框架。更多spring面試題加答案,點此免費獲取!前端

1 Spring 框架有哪些主要模塊?

截止到目前Spring 框架已集成了 20 多個模塊 。 這些模塊主要被分以下圖所示的核心容器 、 數據訪問 / 集成 、Web、AOP (面向切面編程) 、 工具 、 消息和測試模塊 。java

如圖:web

2 什麼是依賴注入?什麼是控制反轉(IOC)? 在 Spring 中,有幾種依賴注入方式?

依賴注入是在編譯階段還沒有知所需的功能是來自哪一個的類的狀況下,將其餘對象所依賴的功能對象實例化的模式。面試

在傳統的編程方式中,業務邏輯的流程是由應用程序中的早已被設定好關聯關係的對象來決定的。在使用控制反轉的狀況下,業務邏輯的流程是由對象關係圖來決定的,該對象關係圖由裝配器負責實例化,這種實現方式還能夠將對象之間的關聯關係的定義抽象化。而綁定的過程是經過「依賴注入」實現的。spring

注入方式:
* 構造器注入
* Setter方法注入
* 接口注入編程

3 在 Spring 中,有幾種配置 Bean 的方式?

  • 基於XML的配置
  • 基於註解的配置
  • 基於Java的配置

4 請解釋一下 Spring Bean 的生命週期?

在一個 bean 實例被初始化時,須要執行一系列的初始化操做以達到可用的狀態 。 一樣的,當一個 bean 不在被調用時須要進行相關的析構操做,並從 bean 容器中移除 。
Spring bean factory 負責管理在 spring 容器中被建立的 bean 的生命週期 。Bean 的生命週期由兩組回調(call back)方法組成 。
初始化以後調用的回調方法。
銷燬以前調用的回調方法。設計模式

Spring 框架提供瞭如下四種方式來管理 bean 的生命週期事件:
* InitializingBean 和 DisposableBean 回調接口
* 針對特殊行爲的其餘 Aware 接口
* Bean 配置文件中的 Custom init() 方法和 destroy() 方法
* @PostConstruct 和 @PreDestroy 註解方式緩存

5 Spring Bean 有哪些做用域,它們之間有什麼區別?

  • singleton :這種 bean 範圍是默認的,這種範圍確保無論接受到多少個請求,每一個容器中只有一個 bean 的實例,單例的模式由 bean factory 自身來維護 。
  • prototype :原形範圍與單例範圍相反,爲每個 bean 請求提供一個實例 。
  • request :在請求 bean 範圍內會每個來自客戶端的網絡請求建立一個實例,在請求完成之後, bean 會失效並被垃圾回收器回收 。
  • Session :與請求範圍相似,確保每一個 session 中有一個 bean 的實例,在 session 過時後, bean 會隨之失效 。
  • global-session : global-session 和 Portlet 應用相關 。 當你的應用部署在 Portlet 容器中工做時,它包含不少 portlet。 若是你想要聲明讓全部的 portlet 共用全局的存儲變量的話,那麼這全局變量須要存儲在 global-session 中 。

6 Spring 框架中的單例 Beans 是線程安全的麼?

實際上,大部分的 Spring bean 並無可變的狀態 ( 好比 Service 類和 DAO 類 ) ,因此在某種程度上說 Spring 的單例 bean 是線程安全的 。 若是你的 bean 有多種狀態的話(好比 View Model 對象),就須要自行保證線程安全 。安全

7 請解釋一下,Spring 框架有哪些自動裝配模式,它們之間有何區別?

  • no :這是 Spring 框架的默認設置,在該設置下自動裝配是關閉的,開發者須要自行在 bean 定義中用標籤明確的設置依賴關係 。
  • byName :該選項能夠根據 bean 名稱設置依賴關係 。 當向一個 bean 中自動裝配一個屬性時,容器將根據 bean 的名稱自動在在配置文件中查詢一個匹配的 bean。 若是找到的話,就裝配這個屬性,若是沒找到的話就報錯 。
  • byType :該選項能夠根據 bean 類型設置依賴關係 。 當向一個 bean 中自動裝配一個屬性時,容器將根據 bean 的類型自動在在配置文件中查詢一個匹配的 bean。 若是找到的話,就裝配這個屬性,若是沒找到的話就報錯 。
  • constructor :構造器的自動裝配和 byType 模式相似,可是僅僅適用於與有構造器相同參數的 bean ,若是在容器中沒有找到與構造器參數類型一致的 bean ,那麼將會拋出異常 。
  • autodetect :該模式自動探測使用構造器自動裝配或者 byType 自動裝配 。 首先,首先會嘗試找合適的帶參數的構造器,若是找到的話就是用構造器自動裝配,若是在 bean 內部沒有找到相應的構造器或者是無參構造器,容器就會自動選擇 byTpe 的自動裝配方式 。

8 Spring 框架中用到了哪些設計模式?請舉例說明

Spring 框架中使用到了大量的設計模式,下面列舉了比較有表明性的:性能優化

  • 代理模式 — 在 AOP 和 remoting 中被用的比較多 。

  • 單例模式 — 在 spring 配置文件中定義的 bean 默認爲單例模式 。

  • 模板方法 — 用來解決代碼重複的問題 。 好比 RestTemplate, JmsTemplate, JpaTemplate。

  • 前端控制器 —Spring 提供了 DispatcherServlet 來對請求進行分發 。

  • 視圖幫助 (View Helper )—Spring 提供了一系列的 JSP 標籤,高效宏來輔助將分散的代碼整合在視圖裏 。

  • 依賴注入 — 貫穿於 BeanFactory / ApplicationContext 接口的核心理念 。

  • 工廠模式 —BeanFactory 用來建立對象的實例 。

9 說說 Springmvc 有哪些優勢?

  • 它是基於組件技術的 . 所有的應用對象 , 不管控制器和視圖 , 仍是業務對象之類的都是 java 組件 . 而且和 Spring 提供的其餘基礎結構緊密集成 .
  • 不依賴於 Servlet API( 目標雖是如此 , 可是在實現時確實是依賴於 Servlet 的 )
  • 能夠任意使用各類視圖技術 , 而不只僅侷限於 JSP
  • 支持各類請求資源的映射策略
  • 它應是易於擴展的

10 Spring 框架的事務管理有哪些優勢?

  • 它爲不一樣的事務 API 如 JTA , JDBC , Hibernate , JPA 和 JDO ,提供一個不變的編程模式 。
  • 它爲編程式事務管理提供了一套簡單的 API 而不是一些複雜的事務 API。
  • 它支持聲明式事務管理 。
  • 它和 Spring 各類數據訪問抽象層很好的集成 。

11 AOP 的應用場景、原理 、AOP 好處?

AOP–Aspect Oriented Programming 面向切面編程;用來封裝橫切關注點,具體能夠在下面的場景中使用:

  • Authentication 權限
  • Caching 緩存
  • Context passing 內容傳遞
  • Error handling 錯誤處理
  • Lazy loading 懶加載
  • Debugging 調試
  • logging, tracing, profiling and monitoring 記錄跟蹤優化校準
  • Performance optimization  性能優化
  • Persistence 持久化
  • Resource pooling  資源池
  • Synchronization  同步
  • Transactions 事務

原理: AOP 是面向切面編程,是經過動態代理的方式爲程序添加統一功能,集中解決一些公共問題 。

優勢:
* 各個步驟之間的良好隔離性耦合性大大下降 。
* 源代碼無關性,再擴展功能的同時不對源碼進行修改操做。

12 Spring 中常見的建立對象的註解有哪些?

  • @Component
  • @Controller
  • @Service
  • @Repository

13 Spring 管理事務的方式有幾種?

一、編程式事務,在代碼中硬編碼。(不推薦使用)

二、聲明式事務,在配置文件中配置(推薦使用)

聲明式事務又分爲兩種:

a、基於XML的聲明式事務

b、基於註解的聲明式事務

14 spring 中的核心類有那些,各有什麼做用?

  • BeanFactory:產生一個新的實例,能夠實現單例模式。

  • BeanWrapper:提供統一的 get 及 set 方法。

  • ApplicationContext:提供框架的實現,包括 BeanFactory 的全部功能。

15 spring 中有哪些代理方式?實現原理是什麼?這些方式的優缺點是什麼?

一、若目標對象實現了若干接口, spring 使用 JDK 的 java.lang.reflect.Proxy 類代理 。

  • 優勢:由於有接口,因此使系統更加鬆耦合

    • 缺點:爲每個目標類建立接口

二、若目標對象沒有實現任何接口, spring 則使用 CGLIB 庫生成目標對象的子類 。

  • 優勢:由於代理類與目標類是繼承關係,因此不須要有接口的存在 。

  • 缺點:由於沒有使用接口,因此係統的耦合性沒有使用 JDK 的動態代理好 。

16 說說 IoC 容器的初始化過程?

  • Resource 定位:咱們通常使用外部資源來描述 Bean 對象,因此 IOC 容器第一步就是須要定位 Resource 外部資源 。Resource 的定位其實就是 BeanDefinition 的資源定位,它是由 ResourceLoader 經過統一的 Resource 接口來完成的,這個 Resource 對各類形式的 BeanDefinition 的使用都提供了統一接口 。
  • 載入:第二個過程就是 BeanDefinition 的載入 ,BeanDefinitionReader 讀取 , 解析 Resource 定位的資源,也就是將用戶定義好的 Bean 表示成 IOC 容器的內部數據結構也就是 BeanDefinition, 在 IOC 容器內部維護着一個 BeanDefinition Map 的數據結構,經過這樣的數據結構, IOC 容器可以對 Bean 進行更好的管理 。 在配置文件中每個都對應着一個 BeanDefinition 對象 。
  • 註冊:第三個過程則是註冊,即向 IOC 容器註冊這些 BeanDefinition ,這個過程是經過 BeanDefinitionRegistery 接口來實現的 。

17 說說 BeanFactory 和 ApplicationContext 的區別? 什麼是延遲實例化,它的優缺點是什麼?

BeanFactory 是 Spring 裏面最低層的接口,提供了最簡單的容器的功能,只提供了實例化對象和獲取對象的功能 。

二者裝載 bean 的區別
* BeanFactory :在啓動時不會去實例化 Bean ,只有從容器中獲取 Bean 時纔會去實例化。
* ApplicationContext :在啓動的時候就把全部的 Bean 所有實例化了 。 它還能夠爲 Bean 配置 lazy-init=true 來讓 Bean 延遲實例化。

延遲實例化
優勢: 應用啓動時佔用資源不多,對資源要求較高的應用,比較有優點。
缺點:速度會相對來講慢一些 。 並且有可能會出現空指針異常的錯誤,並且經過 bean 工廠建立的 bean 生命週期會簡單一些。 全部的 Bean 在啓動的時候都加載,系統運行的速度快,並且能夠儘早的發現系統中的配置問題 。

建議 web 應用,在啓動的時候就把全部的 Bean 都加載了 。

18 說說 AOP 的實現原理?動態代理的方式有哪些?

Spring AOP 使用的是動態代理,所謂的動態代理就是說 AOP 框架不會去修改字節碼,而是在內存中臨時爲方法生成一個 AOP 對象,這個 AOP 對象包含了目標對象的所有方法,而且在特定的切點作了加強處理,並回調原對象的方法 。

Spring AOP 中的動態代理主要有兩種方式, JDK 動態代理和 CGLIB 動態代理 。
* JDK 動態代理經過反射來接收被代理的類,而且要求被代理的類必須實現一個接口 。JDK 動態代理的核心是 InvocationHandler 接口和 Proxy 類 。
* 若是目標類沒有實現接口,那麼 Spring AOP 會選擇使用 CGLIB 來動態代理目標類 。CGLIB ( Code Generation Library ),是一個代碼生成的類庫,能夠在運行時動態的生成某個類的子類,注意, CGLIB 是經過繼承的方式作的動態代理,所以若是某個類被標記爲 final ,那麼它是沒法使用 CGLIB 作動態代理的 。

固然了,這只是小編整理的一部分,有須要更多面試題加答案的朋友,點此免費獲取!

相關文章
相關標籤/搜索