spring常見面試題問答-陸續更新

Spring MVC 運行流程 
一、先用文字描述 
1.用戶發送請求到 DispatchServlet 
2.DispatchServlet根據請求路徑查詢具體的 Handler 
3.HandlerMapping返回一個 HandlerExcutionChain給 DispatchServlet 
 HandlerExcutionChain:Handler和 Interceptor集合 
4.DispatchServlet調用 HandlerAdapter適配器 
5.HandlerAdapter調用具體的 Handler處理業務 
6.Handler處理結束返回一個具體的 ModelAndView給適配器 
ModelAndView:model–>數據模型,view–>視圖名稱 
7.適配器將 ModelAndView給 DispatchServlet 
8.DispatchServlet把視圖名稱給 ViewResolver視圖解析器 
9.ViewResolver返回一個具體的視圖給 DispatchServlet 
10.渲染視圖 
11.展示給用戶 

 

Spring 框架中用到了哪些設計模式 
Spring框架中使用到了大量的設計模式,下面列舉了比較有代表性的: 
代理模式—在 AOP和 remoting中被用的比較多。  

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

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

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

適配器–spring aop  

裝飾器–spring data hashmapper  

觀察者– spring 時間驅動模型  

回調–Spring ResourceLoaderAware回調接口  

前端控制器–spring用前端控制器 DispatcherServlet對請求進行分發 

 

AOP 和 IOC 的原理

答:(1). IoC(Inversion of Control)是指容器控制程序對象之間的關係,而不是傳統實現中,由程序代碼直接操控。控制權由應用代碼中轉到了外部容器,控制權的轉移是所謂反轉。 對於Spring而言,就是由Spring來控制對象的生命週期和對象之間的關係;IoC還有另外一個名字——“依賴注入(Dependency Injection)”。從名字上理解,所謂依賴注入,即組件之間的依賴關係由容器在運行期決定,即由容器動態地將某種依賴關係注入到組件之中。  

(2). 在Spring的工作方式中,所有的類都會在spring容器中登記,告訴spring這是個什麼東西,你需要什麼東西,然後spring會在系統運行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的創建、銷燬都由 spring來控制,也就是說控制對象生存週期的不再是引用它的對象,而是spring。對於某個具體的對象而言,以前是它控制其他對象,現在是所有對象都被spring控制,所以這叫控制反轉。

(3). 在系統運行中,動態的向某個對象提供它所需要的其他對象。  

(4). 依賴注入的思想是通過反射機制實現的,在實例化一個類時,它通過反射調用類中set方法將事先保存在HashMap中的類屬性注入到類中。 總而言之,在傳統的對象創建方式中,通常由調用者來創建被調用者的實例,而在Spring中創建被調用者的工作由Spring來完成,然後注入調用者,即所謂的依賴注入or控制反轉。 注入方式有兩種:依賴注入和設置注入; IoC的優點:降低了組件之間的耦合,降低了業務對象之間替換的複雜性,使之能夠靈活的管理對象。

AOP(Aspect Oriented Programming)

(1). AOP面向方面編程基於IoC,是對OOP的有益補充;

(2). AOP利用一種稱爲“橫切”的技術,剖解開封裝的對象內部,並將那些影響了 多個類的公共行爲封裝到一個可重用模塊,並將其名爲“Aspect”,即方面。所謂“方面”,簡單地說,就是將那些與業務無關,卻爲業務模塊所共同調用的 邏輯或責任封裝起來,比如日誌記錄,便於減少系統的重複代碼,降低模塊間的耦合度,並有利於未來的可操作性和可維護性。

(3). AOP代表的是一個橫向的關 系,將“對象”比作一個空心的圓柱體,其中封裝的是對象的屬性和行爲;則面向方面編程的方法,就是將這個圓柱體以切面形式剖開,選擇性的提供業務邏輯。而 剖開的切面,也就是所謂的“方面”了。然後它又以巧奪天功的妙手將這些剖開的切面復原,不留痕跡,但完成了效果。

(4). 實現AOP的技術,主要分爲兩大類:一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行;二是採用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼。

(5). Spring實現AOP:JDK動態代理和CGLIB代理 JDK動態代理:其代理對象必須是某個接口的實現,它是通過在運行期間創建一個接口的實現類來完成對目標對象的代理;其核心的兩個類是InvocationHandler和Proxy。 CGLIB代理:實現原理類似於JDK動態代理,只是它在運行期間生成的代理對象是針對目標類擴展的子類。CGLIB是高效的代碼生成包,底層是依靠ASM(開源的java字節碼編輯類庫)操作字節碼實現的,性能比JDK強;需要引入包asm.jar和cglib.jar。   使用AspectJ注入式切面和@AspectJ註解驅動的切面實際上底層也是通過動態代理實現的。

(6). AOP使用場景:           

Authentication 權限檢查     

Caching 緩存     

Context passing 內容傳遞     

Error handling 錯誤處理     

Lazy loading 延遲加載     

Debugging 調試    

logging, tracing, profiling and monitoring 日誌記錄,跟蹤,優化,校準     

Performance optimization 性能優化,效率檢查     

Persistence 持久化     

Resource pooling 資源池     

Synchronization 同步     

Transactions 事務管理   

另外Filter的實現和struts2的攔截器的實現都是AOP思想的體現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章