JAVA關於Spring 面試題彙總

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

如圖:

JAVA關於Spring 面試題彙總

2 什麼是依賴注入?什麼是控制反轉(IOC)? 在 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 面試題彙總

它是基於組件技術的 . 全部的應用對象 , 無論控制器和視圖 , 還是業務對象之類的都是 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

JAVA關於Spring 面試題彙總

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

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

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

聲明式事務又分為兩種:

a、基於XML的聲明式事務

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

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

BeanFactory:產生一個新的實例,可以實現單例模式。

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

ApplicationContext:提供框架的實現,包括 BeanFactory 的所有功能。

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

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

優點:因為有接口,所以使系統更加松耦合

缺點:為每一個目標類創建接口

2、若目標對象沒有實現任何接口, 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 做動態代理的 。

ps.如果你也在學java的話,可以私信我 學習 來加我免費帶。


分享到:


相關文章: