面試篇:Spring和SpringMVC瞭解嗎

簡單介紹一下 bean;知道 Spring 的 bean 的做用域與生命週期嗎?

在 Spring 中,那些組成應用程序的主體及由 Spring IOC 容器所管理的對象,被稱之爲 bean。簡單地講,bean 就是由 IOC 容器初始化、裝配及管理的對象,除此以外,bean 就與應用程序中的其餘對象沒有什麼區別了。而 bean 的定義以及 bean 相互間的依賴關係將經過配置元數據來描述。前端

Spring 中的 bean 默認都是單例的,這些單例 Bean 在多線程程序下如何保證線程安全呢? 例如對於 Web 應用來講,Web 容器對於每一個用戶請求都建立一個單獨的 Sevlet 線程來處理請求,引入 Spring 框架以後,每一個 Action 都是單例的,那麼對於 Spring 託管的單例 Service Bean,如何保證其安全呢? Spring 的單例是基於 BeanFactory 也就是 Spring 容器的,單例 Bean 在此容器內只有一個,Java 的單例是基於 JVM,每一個 JVM 內只有一個實例。java

Spring 的 bean 的生命週期以及更多內容能夠查看:

SpringMVC 原理了解嗎?

客戶端發送請求-> 前端控制器 DispatcherServlet 接受客戶端請求 -> 找處處理器映射 HandlerMapping 解析請求對應的 Handler-> HandlerAdapter 會根據 Handler 來調用真正的處理器處理請求,並處理相應的業務邏輯 -> 處理器返回一個模型視圖 ModelAndView -> 視圖解析器進行解析 -> 返回一個視圖對象->前端控制器 DispatcherServlet 渲染數據(Model)->將獲得視圖對象返回給用戶git

Spring AOP IOC 實現原理

IOC: 控制反轉也叫依賴注入。IOC 利用 java 反射機制,AOP 利用代理模式。IOC 概念看似很抽象,可是很容易理解。說簡單點就是將對象交給容器管理,你只須要在 spring 配置文件中配置對應的 bean 以及設置相關的屬性,讓 spring 容器來生成類的實例對象以及管理對象。在 spring 容器啓動的時候,spring 會把你在配置文件中配置的 bean 都初始化好,而後在你須要調用的時候,就把它已經初始化好的那些 bean 分配給你須要調用這些 bean 的類。github

AOP: 面向切面編程。(Aspect-Oriented Programming) 。AOP 能夠說是對 OOP 的補充和完善。OOP 引入封裝、繼承和多態性等概念來創建一種對象層次結構,用以模擬公共行爲的一個集合。實現 AOP 的技術,主要分爲兩大類:一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行;二是採用靜態織入的方式,引入特定的語法建立「方面」,從而使得編譯器能夠在編譯期間織入有關「方面」的代碼,屬於靜態代理。spring

Spring 中的事務傳播行爲了解嗎?TransactionDefinition 接口中哪五個表示隔離級別的常量?

事務傳播行爲

事務傳播行爲(爲了解決業務層方法之間互相調用的事務問題): 當事務方法被另外一個事務方法調用時,必須指定事務應該如何傳播。例如:方法可能繼續在現有事務中運行,也可能開啓一個新事務,並在本身的事務中運行。在 TransactionDefinition 定義中包括了以下幾個表示傳播行爲的常量:sql

支持當前事務的狀況:

TransactionDefinition.PROPAGATION_REQUIRED: 若是當前存在事務,則加入該事務;若是當前沒有事務,則建立一個新的事務。數據庫

TransactionDefinition.PROPAGATION_SUPPORTS: 若是當前存在事務,則加入該事務;若是當前沒有事務,則以非事務的方式繼續運行。編程

TransactionDefinition.PROPAGATION_MANDATORY: 若是當前存在事務,則加入該事務;若是當前沒有事務,則拋出異常。(mandatory:強制性) 不支持當前事務的狀況:後端

TransactionDefinition.PROPAGATION_REQUIRES_NEW: 建立一個新的事務,若是當前存在事務,則把當前事務掛起。安全

TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事務方式運行,若是當前存在事務,則把當前事務掛起。

TransactionDefinition.PROPAGATION_NEVER: 以非事務方式運行,若是當前存在事務,則拋出異常。 其餘狀況:

TransactionDefinition.PROPAGATION_NESTED: 若是當前存在事務,則建立一個事務做爲當前事務的嵌套事務來運行;若是當前沒有事務,則該取值等價於 TransactionDefinition.PROPAGATION_REQUIRED。

隔離級別

TransactionDefinition 接口中定義了五個表示隔離級別的常量:

  • TransactionDefinition.ISOLATION_DEFAULT: 使用後端數據庫默認的隔離級別,Mysql 默認採用的 REPEATABLE_READ 隔離級別 Oracle 默認採用的 READ_COMMITTED 隔離級別.
  • TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 最低的隔離級別,容許讀取還沒有提交的數據變動,可能會致使髒讀、幻讀或不可重複讀
  • TransactionDefinition.ISOLATION_READ_COMMITTED: 容許讀取併發事務已經提交的數據,能夠阻止髒讀,可是幻讀或不可重複讀仍有可能發生
  • TransactionDefinition.ISOLATION_REPEATABLE_READ: 對同一字段的屢次讀取結果都是一致的,除非數據是被自己事務本身所修改,能夠阻止髒讀和不可重複讀,但幻讀仍有可能發生。
  • TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔離級別,徹底服從 ACID 的隔離級別。全部的事務依次逐個執行,這樣事務之間就徹底不可能產生干擾,也就是說,該級別能夠防止髒讀、不可重複讀以及幻讀。可是這將嚴重影響程序的性能。一般狀況下也不會用到該級別。

參考:github.com/Snailclimb/…

相關文章
相關標籤/搜索