標籤:let 流程 佔用 推薦 階段 lazy 選擇 構造 必須
1 Spring 架構有哪些主要模組?
截止到目前Spring 架構已整合了 20 多個模組 。 這些模組主要被分如所示的核心容器 、 資料訪問 / 整合 、Web、AOP (面向切面編程) 、 工具 、 訊息和測試模組 。
2 什麼是依賴注入?什麼是控制反轉(IOC)? 在 Spring 中,有幾種依賴注入方式?
依賴注入是在編譯階段尚未知所需的功能是來自哪個的類的情況下,將其他對象所依賴的功能對象執行個體化的模式。
在傳統的編程方式中,商務邏輯的流程是由應用程式中的早已被設定好關聯關係的對象來決定的。在使用控制反轉的情況下,商務邏輯的流程是由對象關係圖來決定的,該對象關係圖由裝配器負責執行個體化,這種實現方式還可以將對象之間的關聯關係的定義抽象化。而綁定的過程是通過“依賴注入”實現的。
注入方式:
3 在 Spring 中,有幾種配置 Bean 的方式?
基於XML的配置
基於註解的配置
基於Java的配置
4 請解釋一下 Spring Bean 的生命週期?
在一個 bean 執行個體被初始化時,需要執行一系列的初始化操作以達到可用的狀態 。 同樣的,當一個 bean 不在被調用時需要進行相關的析構操作,並從 bean 容器中移除 。
Spring bean factory 負責管理在 spring 容器中被建立的 bean 的生命週期 。Bean 的生命週期由兩組回調(call back)方法組成 。
初始化之後調用的回調方法。
銷毀之前調用的回調方法。
Spring 架構提供了以下四種方式來管理 bean 的生命週期事件:
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 管理事務的方式有幾種?
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 的區別
延遲執行個體化
優點: 應用啟動時佔用資源很少,對資源要求較高的應用,比較有優勢。
缺點:速度會相對來說慢一些 。 而且有可能會出現null 指標異常的錯誤,而且通過 bean 工廠建立的 bean 生命週期會簡單一些。 所有的 Bean 在啟動的時候都載入,系統啟動並執行速度快,而且可以儘早的發現系統中的配置問題 。
建議 web 應用,在啟動的時候就把所有的 Bean 都載入了 。
18 說說 AOP 的實現原理?動態代理的方式有哪些?
Spring AOP 使用的是動態代理,所謂的動態代理就是說 AOP 架構不會去修改位元組碼,而是在記憶體中臨時為方法產生一個 AOP 對象,這個 AOP 對象包含了目標對象的全部方法,並且在特定的切點做了增強處理,並回調原對象的方法 。
Spring AOP 中的動態代理主要有兩種方式, JDK 動態代理和 CGLIB 動態代理 。
JAVA關於Spring 面試題匯總