在 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 的生命週期以及更多內容能夠查看:客戶端發送請求-> 前端控制器 DispatcherServlet 接受客戶端請求 -> 找處處理器映射 HandlerMapping 解析請求對應的 Handler-> HandlerAdapter 會根據 Handler 來調用真正的處理器處理請求,並處理相應的業務邏輯 -> 處理器返回一個模型視圖 ModelAndView -> 視圖解析器進行解析 -> 返回一個視圖對象->前端控制器 DispatcherServlet 渲染數據(Model)->將獲得視圖對象返回給用戶git
IOC: 控制反轉也叫依賴注入。IOC 利用 java 反射機制,AOP 利用代理模式。IOC 概念看似很抽象,可是很容易理解。說簡單點就是將對象交給容器管理,你只須要在 spring 配置文件中配置對應的 bean 以及設置相關的屬性,讓 spring 容器來生成類的實例對象以及管理對象。在 spring 容器啓動的時候,spring 會把你在配置文件中配置的 bean 都初始化好,而後在你須要調用的時候,就把它已經初始化好的那些 bean 分配給你須要調用這些 bean 的類。github
AOP: 面向切面編程。(Aspect-Oriented Programming) 。AOP 能夠說是對 OOP 的補充和完善。OOP 引入封裝、繼承和多態性等概念來創建一種對象層次結構,用以模擬公共行爲的一個集合。實現 AOP 的技術,主要分爲兩大類:一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行;二是採用靜態織入的方式,引入特定的語法建立「方面」,從而使得編譯器能夠在編譯期間織入有關「方面」的代碼,屬於靜態代理。spring
事務傳播行爲(爲了解決業務層方法之間互相調用的事務問題): 當事務方法被另外一個事務方法調用時,必須指定事務應該如何傳播。例如:方法可能繼續在現有事務中運行,也可能開啓一個新事務,並在本身的事務中運行。在 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 接口中定義了五個表示隔離級別的常量: