面試總結------Spring框架相關
面試總結——Spring框架相關
1. spring IOC與AOP思想的理解
控制反轉(IOC):所謂控制反轉就是應用本身不負責依賴物件的建立及維護,依賴物件的建立及維護是由外部容器負責的。這樣控制權就由應用轉移到了外部容器,控制權的轉移就是所謂反轉。
依賴注入(DI):在執行期,由外部容器動態地將依賴物件注入到元件中,從而建立用物件之間協作關係(也稱為裝配)。在程式碼中的展現形式是在配置檔案applicationContext.xml中管理Bean。
面向切面程式設計被定義為促使應用程式分離關注點的一項技術。系統由許多不同元件組成,每個元件負責一塊特定的功能。除了負責實現自身核心的功能之外,這些元件還承擔著額外的職責。諸如日誌、事務管理和安全此類的系統服務經常融入到有自身核心業務邏輯的元件中去,這些系統通常被稱為橫切關注點,因為它們總是跨越系統的多個元件。
**依賴注入讓相互協作的軟體組織保持鬆散耦合;
AOP程式設計把遍佈應用各處的功能分離出來形成可重用的元件。**
2. spring aop中的propagation的7種配置的意思
REQUIRED:支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
SUPPORTS:支援當前事務,如果當前沒有事務,就以非事務方式執行。
MANDATORY:支援當前事務,如果當前沒有事務,就丟擲異常。
REQUIRES_NEW:新建事務,如果當前存在事務,把當前事務掛起。
NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
NEVER:以非事務方式執行,如果當前存在事務,則丟擲異常。
NESTED:支援當前事務,如果當前事務存在,則執行一個巢狀事務,如果當前沒有事務,就新建一個事務。
3. SpringMVC與Struts2區別與比較總結
(1)Struts2是類級別的攔截, 一個類對應一個request上下文,SpringMVC是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應。所以說從架構本身上SpringMVC就容易實現restful url,而struts2的架構實現起來要費勁,因為Struts2中Action的一個方法可以對應一個url,而其類屬性卻被所有方法共享,這也就無法用註解或其他方式標識其所屬方法了。
(2)由上邊原因,SpringMVC的方法之間基本上獨立的,獨享request response資料,請求資料通過引數獲取,處理結果通過ModelMap交回給框架,方法之間不共享變數。而Struts2雖然方法之間也是獨立的,但其所有Action變數是共享的,這不會影響程式執行,卻給我們編碼 讀程式時帶來麻煩,每次來了請求就建立一個Action,一個Action物件對應一個request上下文。
(3)由於Struts2需要針對每個request進行封裝,把request,session等servlet生命週期的變數封裝成一個一個Map,供給每個Action使用,並保證執行緒安全,所以在原則上,是比較耗費記憶體的。
(4)攔截器實現機制上,Struts2有以自己的interceptor機制,SpringMVC用的是獨立的AOP方式,這樣導致Struts2的配置檔案量還是比SpringMVC大。
(5)SpringMVC的入口是servlet,而Struts2是filter(filter和servlet是不同的,以前認為filter是servlet的一種特殊)。
(6)SpringMVC集成了Ajax,使用非常方便,只需一個註解@ResponseBody就可以實現,然後直接返回響應文字即可,而Struts2攔截器集成了Ajax,在Action中處理時一般必須安裝外掛或者自己寫程式碼整合進去,使用起來也相對不方便。
(7)SpringMVC驗證支援JSR303,處理起來相對更加靈活方便,而Struts2驗證比較繁瑣,感覺太煩亂。
(8)Spring MVC和Spring是無縫的。從這個專案的管理和安全上也比Struts2高(當然Struts2也可以通過不同的目錄結構和相關配置做到SpringMVC一樣的效果,但是需要xml配置的地方不少)。
(9)設計思想上,Struts2更加符合OOP的程式設計思想, SpringMVC就比較謹慎,在servlet上擴充套件。
(10)SpringMVC開發效率和效能高於Struts2。
(11)SpringMVC可以認為已經100%零配置。
4. Spring中bean的生命週期
建立:<bean name=”” class=”” 額外屬性>
初始化:配置init-method/實現介面InitializingBean
呼叫:context.getBean(),進行方法的呼叫
銷燬:配置destroy-method/實現DisposableBean介面
5. Spring注入方式
介面注入
屬性注入(屬性的SET/GET)
構造注入(構造方法注入)
使用建構函式依賴注入時,Spring保證所有一個物件所有依賴的物件先例項化後,才例項化這個物件。使用set方法依賴注入時,Spring首先例項化物件,然後才例項化所有依賴的物件。
當設值注入與構造注入同時存在時,先執行設值注入,再執行構造注入。
6. Spring的7大核心模組
(1)Spring Core:Core封裝包是框架的最基礎部分,提供IOC和依賴注入特性。這裡的基礎概念是BeanFactory,它提供對Factory模式的經典實現來消除對程式性單例模式的需要,並真正地允許你從程式邏輯中分離出依賴關係和配置。
(2)Spring Context: 構建於Core封裝包基礎上的Context封裝包,提供了一種框架式的物件訪問方法,像JNDI註冊器。 Context封裝包的特性得自於Beans封裝包,並添加了對國際化(I18N)的支援(例如資源繫結),事件傳播,資源裝載的方式和Context的透明建立,比如說通過Servlet容器。
(3)Spring DAO: DAO(Data Access Object)提供了JDBC的抽象層,它可消除冗長的JDBC編碼和解析資料庫廠商特有的錯誤程式碼。並且,JDBC封裝包還提供了一種比程式設計性更好的宣告性事務管理方法,不僅僅是實現了特定介面,而且對所有的POJOs(plain old Java objects)都適用。
(4)Spring ORM: ORM封裝包提供了常用的“物件/關係”對映APIs的整合層。其中包括JPA、JDO、Hibernate和iBatis。利用ORM封裝包,可以混合使用所有Spring提供的特性進行“物件/關係”對映,如前邊提到的簡單宣告性事務管理。
(5)Spring AOP: Spring的AOP封裝包提供了符合AOP Alliance規範的面向方面的程式設計實現,讓你可以定義,例如方法攔截器(method-interceptors)和切點(pointcuts),從邏輯上講,從而減弱程式碼的功能耦合,清晰的被分離開。而且,利用source-level的元資料功能,還可以將各種行為資訊合併到你的程式碼中。
(6)Spring Web: Spring中的Web包提供了基礎的針對Web開發的整合特性,例如多方檔案上傳,利用Servlet listeners進行IOC容器初始化和針對Web的ApplicationContext。當與WebWork或Struts一起使用Spring時,這個包使Spring可與其他框架結合。
(7)Spring Web MVC: Spring中的MVC封裝包提供了Web應用的Model-View-Controller(MVC)實現。Spring的MVC框架並不是僅僅提供一種傳統的實現,它提供了一種清晰的分離模型,在領域模型程式碼和Web Form之間。並且,還可以藉助Spring框架的其他特性。
7. Spring框架中獲取連線池的方式
DBCP資料來源
C3P0資料來源
Spring的資料來源實現類(DriverManagerDataSource)
獲取JNDI資料來源