好程式設計師Java學習路線分享Spring常見面試題

好程式設計師IT發表於2019-10-16

本章面試題內容由好程式設計師Java 教程 為大家整理分享,希望對大家有所幫助。

  問:SpringIOC原理闡述

  答:把物件的建立、初始化、銷燬等工作交給Spring容器來完成。我們可以把IOC 容器的工作模式看做是工廠模式的昇華,可以把IOC 容器看作是一個工廠,這個工廠裡要生產的物件都在配置檔案中給出定義,然後利用程式語言的的反射程式設計,根據配置檔案中給出的類名生成相應的物件。從實現來看,IOC 是把以前在工廠方法裡寫死的物件生成程式碼,改變為由配置檔案來定義,也就是把工廠和物件生成這兩者獨立分隔開來,目的就是提高靈活性和可維護性。

  問:SpringAOP原理

  答:1)物件導向的設計沒有辦法解決重複程式碼的問題

  2)SpringAOP使用動態代理技術在執行期植入增強的程式碼,aspectj 是在編譯器織入橫切程式碼的形式來實現代理技術的

  3)SpringAOP使用了兩種代理機制, 一種是基於JDK 的動態代理, 一種是基於CGLib 的動態代理

  4)JDK1.3以後java 提供了動態代理的技術, 執行開發者在執行期建立介面的代理例項

  5)jdk的動態代理主要涉及java.lang.reflect 包中的兩個類ProxyInvcoationHandler

  6)InvcoationHandler是一個介面, 透過實行該介面可以訂閱橫切邏輯, 並透過反射機制呼叫目標類的程式碼, 動態講橫切邏輯和業務邏輯編織在一起

  7)Proxy利用InvocationHandler 動態建立一個符號某一介面的例項, 生成目標類的代理物件

  8)cglib採用非常底層的位元組碼技術, 可以為一個類建立子類, 並在子類中採用方法攔截技術攔截所有的父類方法的呼叫, 並順勢織入橫切邏輯

  問:AOP中的概念解釋

  答:切面:Aspect,連線點:Joinpoint, 增強:Advice, 切入點:Pointcut, 目標物件:Target, 代理:Proxy, 其中增強包括: 前置增強, 後置增強, 返回會增強, 環繞增強, 丟擲異常後增強

  問:使用SpringAOP可以基於兩種方式

  答:一種是比較方便和強大的註解方式,使用註解配置SpringAOP 總體分為兩步, 第一步是在xml 檔案中宣告啟用自動掃描元件功能, 同時啟用自動代理功能, 一種則是中規中矩的xml 配置方式

  問:Spring的事務傳播機制

  答:1)REQUIRED(預設) :支援使用當前事務, 如果當前事務不存在, 建立一個新事務。

  2)SUPPORTS:支援使用當前事務, 如果當前事務不存在, 則不使用事務。

  3)MANDATORY:中文翻譯為強制, 支援使用當前事務, 如果當前事務不存在, 則丟擲Exception

  4)REQUIRES_NEW:建立一個新事務, 如果當前事務存在, 把當前事務掛起。

  5)NOT_SUPPORTED:無事務執行, 如果當前事務存在, 把當前事務掛起。

  6)NEVER:無事務執行, 如果當前有事務則丟擲Exception

  7)NESTED:巢狀事務, 如果當前事務存在, 那麼在巢狀的事務中執行。如果當前事務不存在, 則表現跟REQUIRED 一樣。

  問:Spring的事務實現方式

  答:1)程式設計式事務管理對基於POJO 的應用來說是唯一選擇。我們需要在程式碼中呼叫beginTransaction() commit() rollback() 等事務管理相關的方法, 這就是程式設計式事務管理。

  2)基於TransactionProxyFactoryBean 的宣告式事務管理

  3)基於@Transactional 的宣告式事務管理

  4)基於AspectjAOP 配置事務

  問:Spring透過單例項化Bean 簡化多執行緒問題

  答:由於Spring的事務管理器是透過執行緒相關的ThreadLocal 來儲存資料訪問基礎設施( 也即Connection 例項) web 容器本身就是多執行緒的,web 容器為一個http 請求建立一個獨立的執行緒( 實際大多數採用執行緒池) ,所以bean 也是執行在多執行緒的環境下,在大多數情況下,Spring bean 都是單例的,單例的好處就是執行緒無關性,不存在多執行緒併發問題,Spring 是透過ThreadLocal 將有狀態的變數本地執行緒化,達到另一個層面上的執行緒無關。

  問:SpringMVC工作原理

  答:SpringMVC框架圍繞dispactcherServlet 這個核心展開,dispatcherServlet SpringMVC 的總導演,總策劃,他負責攔截請求並將器分派給響應的處理器處理。SpringMVC 框架包括註解驅動控制器,請求及響應的資訊處理,表單標籤繫結,檢視解析,本地化解析,上傳檔案解析,異常處理。

  SpringMVC透過一個前端servlet 接收所有的請求,並將具體工作委託給其他元件進行處理

  1)整個過程開始於客戶端傳送一個HTTP 請求,如果匹配web.xml 的對映路徑,則進行處理

  2)DispatcherServlet根據HandlerMapping 找到對應的Handler, 將處理權交給Handler

  3)HandlerAdapter這個介面卡對各種Hander 方法進行呼叫

  4)處理完了之後返回一個ModelAndView DispatcherServelt

  5)Handler返回的ModelAndView() 只是一個邏輯檢視並不是一個正式的檢視,DispatcherSevlet 透過ViewResolver 將邏輯檢視轉化為真正的檢視View

  6)根據ModelAndView 對模型資料進行檢視渲染

  7)最終客戶端得到相應訊息,可能是一個普通的HTML 頁面,也可能是一個XML 或者JSON

  問:SpringMVC和Struts2 的區別

  答:1)攔截機制的不同

  Struts2是類級別的攔截,每次請求就會建立一個Action ,和Spring 整合時Struts2 ActionBean 注入作用域是原型模式prototype ,然後透過setter getter request 資料注入到屬性。Struts2 中,一個Action 對應一個request response 上下文,在接收引數時,可以透過屬性接收,這說明屬性引數是讓多個方法共享的。Struts2 Action 的一個方法可以對應一個url ,而其類屬性卻被所有方法共享,這也就無法用註解或其他方式標識其所屬方法了,只能設計為多例。

  SpringMVC是方法級別的攔截,一個方法對應一個Request 上下文,所以方法直接基本上是獨立的,獨享request response 資料。而每個方法同時又何一個url 對應,引數的傳遞是直接注入到方法中的,是方法所獨有的。處理結果透過ModeMap 返回給框架。在Spring 整合時,SpringMVC ControllerBean 預設單例模式Singleton ,所以預設對所有的請求,只會建立一個Controller ,有應為沒有共享的屬性,所以是執行緒安全的,如果要改變預設的作用域,需要新增@Scope 註解修改。

  Struts2有自己的攔截Interceptor 機制,SpringMVC 這是用的是獨立的AOP 方式,這樣導致Struts2 的配置檔案量還是比SpringMVC 大。

  2)底層框架的不同

  Struts2採用Filter(StrutsPrepareAndExecuteFilter) 實現,SpringMVC(DispatcherServlet) 則採用Servlet 實現。Filter 在容器啟動之後即初始化; 服務停止以後墜毀,晚於Servlet Servlet 在是在呼叫時初始化,先於Filter 呼叫,服務停止後銷燬。

  3)效能方面

  Struts2是類級別的攔截,每次請求對應例項一個新的Action ,需要載入所有的屬性值注入,SpringMVC 實現了零配置,由於SpringMVC 基於方法的攔截,有載入一次單例模式bean 注入。所以,SpringMVC 開發效率和效能高於Struts2

  4)配置方面

SpringMVC Spring 是無縫的。從這個專案的管理和安全上也比Struts2 高。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2660147/,如需轉載,請註明出處,否則將追究法律責任。

相關文章