好程序員Java學習路線分享Spring常見面試題

本章面試題內容由好程序員Java教程爲你們整理分享,但願對你們有所幫助。前端

  問:SpringIOC原理闡述java

  答:把對象的建立、初始化、銷燬等工做交給Spring容器來完成。咱們能夠把IOC容器的工做模式看作是工廠模式的昇華,能夠把IOC容器看做是一個工廠,這個工廠裏要生產的對象都在配置文件中給出定義,而後利用編程語言的的反射編程,根據配置文件中給出的類名生成相應的對象。從實現來看,IOC是把之前在工廠方法裏寫死的對象生成代碼,改變爲由配置文件來定義,也就是把工廠和對象生成這二者獨立分隔開來,目的就是提升靈活性和可維護性。程序員

  問:SpringAOP原理web

  答:1)面向對象的設計沒有辦法解決重複代碼的問題面試

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

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

  4)JDK1.3之後java提供了動態代理的技術,運行開發者在運行期建立接口的代理實例多線程

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

  6)InvcoationHandler是一個接口,經過實行該接口能夠訂閱橫切邏輯,並經過反射機制調用目標類的代碼,動態講橫切邏輯和業務邏輯編織在一塊兒app

  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高。

相關文章
相關標籤/搜索