好程式設計師Java學習路線分享Spring常見面試題
本章面試題內容由好程式設計師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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師web前端學習路線分享HTML5常見面試題程式設計師Web前端HTML面試題
- 好程式設計師分享:Java面試題常見問題程式設計師Java面試題
- 好程式設計師Java教程分享:Java工程師常見面試題程式設計師Java工程師面試題
- 好程式設計師Java教程分享XML常見面試題程式設計師JavaXML面試題
- 好程式設計師Java教程分享JavaScript常見面試題一程式設計師JavaScript面試題
- 好程式設計師Java教程分享JavaScript常見面試題五程式設計師JavaScript面試題
- 好程式設計師Java教程分享JavaScript常見面試題四程式設計師JavaScript面試題
- 好程式設計師Java教程分享JavaScript常見面試題三程式設計師JavaScript面試題
- 好程式設計師Java教程分享JavaScript常見面試題二程式設計師JavaScript面試題
- 好程式設計師web前端分享常見面試題程式設計師Web前端面試題
- 好程式設計師Java學習路線分享Java面試題之載入機制程式設計師Java面試題
- 好程式設計師Java教程分享Java面試常見技術難題程式設計師Java面試
- 好程式設計師Java教程分享Java多執行緒常見面試題程式設計師Java執行緒面試題
- 好程式設計師Java學習路線分享MyBatis之Spring整合程式設計師JavaMyBatisSpring
- 好程式設計師Java學習路線分享SpringCloud程式設計師JavaSpringGCCloud
- 好程式設計師web前端學習路線分享前端基礎面試題程式設計師Web前端面試題
- 好程式設計師Python教程分享常見的Python面試題程式設計師Python面試題
- 好程式設計師Python教程分享Python常見面試問題程式設計師Python面試
- 好程式設計師web前端教程分享Jquery常見面試題程式設計師Web前端jQuery面試題
- 好程式設計師分享Java常見面試題Tomcat最佳化經驗程式設計師Java面試題Tomcat
- 好程式設計師Java培訓分享Java多執行緒常見面試問題程式設計師Java執行緒面試
- Java程式設計師面試常見問題Java程式設計師面試
- 好程式設計師Java學習路線分享mybatis對映程式設計師JavaMyBatis
- 好程式設計師Java學習路線分享Spring建立Bean的3種方式程式設計師JavaSpringBean
- 好程式設計師web前端教程分享HTML/CSS部分常見面試題程式設計師Web前端HTMLCSS面試題
- 好程式設計師Java培訓分享22道Spring Boot面試題!程式設計師JavaSpring Boot面試題
- 好程式設計師Java學習路線分享Java框架怎麼搭建程式設計師Java框架
- 好程式設計師Java學習路線分享Java-String常用方法程式設計師Java
- 好程式設計師Java學習路線分享原生Ajax的使用程式設計師Java
- 好程式設計師Java學習路線分享finalize()方法詳解程式設計師Java
- 好程式設計師Java學習路線分享JVM相關概念程式設計師JavaJVM
- 好程式設計師Java學習路線分享Redis快速入門程式設計師JavaRedis
- 好程式設計師Java學習路線分享MyBatis之基本使用程式設計師JavaMyBatis
- 好程式設計師Java學習路線分享maven是什麼程式設計師JavaMaven
- 好程式設計師Java學習路線分享SpringMVC之MVC概述程式設計師JavaSpringMVC
- 好程式設計師Java教程分享Java面試題之Hibernate程式設計師Java面試題
- 好程式設計師Java教程分享面試中Spring的技術問題程式設計師Java面試Spring
- 好程式設計師Java分享Javamain十個面試題程式設計師JavaAI面試題