從事JAVA開發的給小夥伴都知道,Spring是java開發當中必不可少的一個框架,不論是面試、開發仍是工做當中,Spring的地位如今是獨樹一幟。好比如今SpringBoot,SpringColud等都是目前開發當中很火的框架。更多spring面試題加答案,點此免費獲取!前端
截止到目前Spring 框架已集成了 20 多個模塊 。 這些模塊主要被分以下圖所示的核心容器 、 數據訪問 / 集成 、Web、AOP (面向切面編程) 、 工具 、 消息和測試模塊 。java
如圖:web
依賴注入是在編譯階段還沒有知所需的功能是來自哪一個的類的狀況下,將其餘對象所依賴的功能對象實例化的模式。面試
在傳統的編程方式中,業務邏輯的流程是由應用程序中的早已被設定好關聯關係的對象來決定的。在使用控制反轉的狀況下,業務邏輯的流程是由對象關係圖來決定的,該對象關係圖由裝配器負責實例化,這種實現方式還能夠將對象之間的關聯關係的定義抽象化。而綁定的過程是經過「依賴注入」實現的。spring
注入方式:
* 構造器注入
* Setter方法注入
* 接口注入編程
在一個 bean 實例被初始化時,須要執行一系列的初始化操做以達到可用的狀態 。 一樣的,當一個 bean 不在被調用時須要進行相關的析構操做,並從 bean 容器中移除 。
Spring bean factory 負責管理在 spring 容器中被建立的 bean 的生命週期 。Bean 的生命週期由兩組回調(call back)方法組成 。
初始化以後調用的回調方法。
銷燬以前調用的回調方法。設計模式
Spring 框架提供瞭如下四種方式來管理 bean 的生命週期事件:
* InitializingBean 和 DisposableBean 回調接口
* 針對特殊行爲的其餘 Aware 接口
* Bean 配置文件中的 Custom init() 方法和 destroy() 方法
* @PostConstruct 和 @PreDestroy 註解方式緩存
實際上,大部分的 Spring bean 並無可變的狀態 ( 好比 Service 類和 DAO 類 ) ,因此在某種程度上說 Spring 的單例 bean 是線程安全的 。 若是你的 bean 有多種狀態的話(好比 View Model 對象),就須要自行保證線程安全 。安全
Spring 框架中使用到了大量的設計模式,下面列舉了比較有表明性的:性能優化
代理模式 — 在 AOP 和 remoting 中被用的比較多 。
單例模式 — 在 spring 配置文件中定義的 bean 默認爲單例模式 。
模板方法 — 用來解決代碼重複的問題 。 好比 RestTemplate, JmsTemplate, JpaTemplate。
前端控制器 —Spring 提供了 DispatcherServlet 來對請求進行分發 。
視圖幫助 (View Helper )—Spring 提供了一系列的 JSP 標籤,高效宏來輔助將分散的代碼整合在視圖裏 。
依賴注入 — 貫穿於 BeanFactory / ApplicationContext 接口的核心理念 。
工廠模式 —BeanFactory 用來建立對象的實例 。
AOP–Aspect Oriented Programming 面向切面編程;用來封裝橫切關注點,具體能夠在下面的場景中使用:
原理: AOP 是面向切面編程,是經過動態代理的方式爲程序添加統一功能,集中解決一些公共問題 。
優勢:
* 各個步驟之間的良好隔離性耦合性大大下降 。
* 源代碼無關性,再擴展功能的同時不對源碼進行修改操做。
一、編程式事務,在代碼中硬編碼。(不推薦使用)
二、聲明式事務,在配置文件中配置(推薦使用)
聲明式事務又分爲兩種:
a、基於XML的聲明式事務
b、基於註解的聲明式事務
BeanFactory:產生一個新的實例,能夠實現單例模式。
BeanWrapper:提供統一的 get 及 set 方法。
ApplicationContext:提供框架的實現,包括 BeanFactory 的全部功能。
一、若目標對象實現了若干接口, spring 使用 JDK 的 java.lang.reflect.Proxy 類代理 。
優勢:由於有接口,因此使系統更加鬆耦合
二、若目標對象沒有實現任何接口, spring 則使用 CGLIB 庫生成目標對象的子類 。
優勢:由於代理類與目標類是繼承關係,因此不須要有接口的存在 。
缺點:由於沒有使用接口,因此係統的耦合性沒有使用 JDK 的動態代理好 。
BeanFactory 是 Spring 裏面最低層的接口,提供了最簡單的容器的功能,只提供了實例化對象和獲取對象的功能 。
二者裝載 bean 的區別
* BeanFactory :在啓動時不會去實例化 Bean ,只有從容器中獲取 Bean 時纔會去實例化。
* ApplicationContext :在啓動的時候就把全部的 Bean 所有實例化了 。 它還能夠爲 Bean 配置 lazy-init=true 來讓 Bean 延遲實例化。
延遲實例化
優勢: 應用啓動時佔用資源不多,對資源要求較高的應用,比較有優點。
缺點:速度會相對來講慢一些 。 並且有可能會出現空指針異常的錯誤,並且經過 bean 工廠建立的 bean 生命週期會簡單一些。 全部的 Bean 在啓動的時候都加載,系統運行的速度快,並且能夠儘早的發現系統中的配置問題 。
建議 web 應用,在啓動的時候就把全部的 Bean 都加載了 。
Spring AOP 使用的是動態代理,所謂的動態代理就是說 AOP 框架不會去修改字節碼,而是在內存中臨時爲方法生成一個 AOP 對象,這個 AOP 對象包含了目標對象的所有方法,而且在特定的切點作了加強處理,並回調原對象的方法 。
Spring AOP 中的動態代理主要有兩種方式, JDK 動態代理和 CGLIB 動態代理 。
* JDK 動態代理經過反射來接收被代理的類,而且要求被代理的類必須實現一個接口 。JDK 動態代理的核心是 InvocationHandler 接口和 Proxy 類 。
* 若是目標類沒有實現接口,那麼 Spring AOP 會選擇使用 CGLIB 來動態代理目標類 。CGLIB ( Code Generation Library ),是一個代碼生成的類庫,能夠在運行時動態的生成某個類的子類,注意, CGLIB 是經過繼承的方式作的動態代理,所以若是某個類被標記爲 final ,那麼它是沒法使用 CGLIB 作動態代理的 。
固然了,這只是小編整理的一部分,有須要更多面試題加答案的朋友,點此免費獲取!