一、基礎概念
Q:Spring是什么?
定義:Spring是一個輕量級的IoC(控制反轉)和AOP容器框架。
目的:用於簡化企業應用程序的開發,使得開發者只需要關心業務需求。
常見的配置方式:
- 基於XML的配置
- 基於注解的配置
- 基於Java的配置
組成:
- Spring Core :核心類庫,提供IOC服務
- Spring Context :提供框架式的Bean訪問方式,以及企業級功能(JNDI、定時任務等)
- Spring AOP :AOP服務
- Spring DAO :對JDBC的抽象,簡化了數據訪問異常的處理
- Spring ORM :對現有的ORM框架的支持
- Spring Web :提供了基本的面向Web的綜合特性,例如多方文件上傳
- Spring MVC :提供面向Web應用的Model-View-Controller實現
- Spring Test:提供了對JUnit和TestNG測試的支持。
Q:使用Spring框架的好處是什么?
- 輕量:Spring 是輕量的,基本的版本大約2MB。
- 低侵入性:低侵入式設計,代碼的污染極低
- 控制反轉:Spring通過控制反轉實現了松散耦合,對象們給出它們的依賴,而不是創建或查找依賴的對象們。
- 面向切面的編程(AOP):Spring支持面向切面的編程,並且把應用業務邏輯和系統服務分開。
- 容器:Spring 包含並管理應用中對象的生命周期和配置。
- MVC框架:Spring的WEB框架是個精心設計的框架,是Web框架的一個很好的替代品。
- 事務管理:Spring 提供一個持續的事務管理接口,可以擴展到上至本地事務下至全局事務(JTA)。
- 異常處理:Spring 提供方便的API把具體技術相關的異常(比如由JDBC,Hibernate or JDO拋出的)轉化為一致的unchecked 異常。
Q:Spring配置文件是什么?
Spring配置文件是個XML 文件,一般命名為applicationContext.xml,這個文件包含了類信息,描述了如何配置它們,以及如何相互調用。
Q:ApplicationContext通常的實現是什么?
- FileSystemXmlApplicationContext :此容器從一個XML文件中加載beans的定義,XML Bean 配置文件的全路徑名必須提供給它的構造函數。
- ClassPathXmlApplicationContext:此容器也從一個XML文件中加載beans的定義,這里,你需要正確設置classpath因為這個容器將在classpath里找bean配置。
- WebXmlApplicationContext:此容器加載一個XML文件,此文件定義了一個WEB應用的所有bean。
Q:BeanFactory和ApplicationContext有什么區別?
概述:都可以當做Spring的容器。其中ApplicationContext是BeanFactory的子接口。
區別:
BeanFactory:
- 是Spring里面最底層的接口。
- 以延遲加載形式來注入Bean的,即只有在使用到某個Bean時(調用getBean()),才對該Bean進行加載實例化。
- 如果Bean的某一個屬性沒有注入,BeanFacotry加載后,直至第一次使用調用getBean方法才會拋出異常。(運行時異常)
ApplicationContext:
- 是BeanFactory的子接口。
- 在容器啟動時,一次性創建了所有的Bean。
- 在容器啟動時,一次性創建了所有的Bean,我們就可以發現Spring中存在的配置錯誤。(啟動時異常)
Q:Spring 框架中都用到了哪些設計模式?
- 工廠模式:BeanFactory就是簡單工廠模式的體現,用來創建對象的實例
- 單例模式:Bean默認為單例模式
- 代理模式:Spring的AOP功能用到了JDK的動態代理和CGLIB字節碼生成技術
- 模板方法:用來解決代碼重復的問題。比如. RestTemplate, JmsTemplate, JpaTemplate
- 觀察者模式:定義對象鍵一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴於它的對象都會得到通知被制動更新,如Spring中listener的實現 :ApplicationListener
- 適配器模式:Spring AOP的增強或通知(Advice)使用到了適配器模式、Spring MVC中也是用到了適配器模式適配Controller。
- 包裝器設計模式:我們的項目需要連接多個數據庫,而且不同的客戶在每次訪問中根據需要會去訪問不同的數據庫。這種模式讓我們可以根據客戶的需求能夠動態切換不同的數據源。
二、IOC/DI
Q:什么是Spring IOC 容器?
Spring IOC 負責創建對象,管理對象,通過依賴注入(DI),裝配對象,配置對象,並且管理這些對象的整個生命周期。
Q:如何理解IOC和DI?
- IOC: 控制反轉
- DI:依賴注入
兩個名詞是以不同角度來描述Spring的工作,控制反轉指的是把創建對象的控制權交由Spring進行處理,從“主動”變成“被動”;依賴注入指的是把配置在Spring容器中,由Spring組裝好的對象引入到你自己的對象之中去。
Q:IOC的優點是什么?
IOC 或 DI把應用的代碼量降到最低。最小的代價和最小的侵入性實現松耦合。
Q:有哪些不同類型的IOC(依賴注入)方式?
- 構造器依賴注入:構造器依賴注入通過容器觸發一個類的構造器來實現的,該類有一系列參數,每個參數代表一個對其他類的依賴。
- Setter方法注入:Setter方法注入是容器通過調用無參構造器或無參static工廠方法實例化bean之后,調用該bean的setter方法,即實現了基於setter的依賴注入。
- 根據注解注入:如用@Autowired、@Resource等注解來進行Bean的注入。
三、Spring Beans
Q:什么是Spring beans?
被Spring IOC容器初始化,裝配,和管理的,形成Spring應用主干的java對象。(默認為單例 tag="singleton")
Q:Spring容器中Bean的生命周期?
- 實例化Bean並填充屬性
- 注入依賴關系
- 初始化
- bean交給應用開發人員處理(進行業務邏輯使用)
- 銷毀
Q:創建Spring beans的方式?
- 構造函數:SpringContext利用無參的構造函數創建一個對象,然后利用setter方法賦值。也可以直接通過有參構造函數直接賦值。
- 靜態方法創建對象:在類中定義一個返回值為需要獲取的對象的構造方法,然后在xml中配置“factory-method”屬性指向構造方法。
- 工廠方法創建對象:實例工程方法需要先創建工廠實例,然后在創建所需對象的時候,將其賦值為“factory-bean”
PS:詳解見Spring創建對象的三種方式
Q:Spring Bean 定義 包含什么?
一個Spring Bean 的定義包含容器必知的所有配置元數據,包括如何創建一個bean,它的生命周期詳情及它的依賴。
PS:元數據主要是描述數據屬性(property)的信息,用來支持如指示存儲位置、歷史數據、資源查找、文件記錄等。
Q:如何給Spring 容器提供配置元數據?
- XML配置文件。
- 基於注解的配置。
- 基於java的配置。(建立一個SpringConfig的java類用於配置,用@Configuration來注解該類)
PS:詳解見Spring中基於java的配置
Q:如何定義Bean的作用域?
可以通過bean 定義中的scope屬性來定義。
Spring框架支持以下五種bean的作用域:
- singleton : bean在每個Spring ioc 容器中只有一個實例。(非線程安全!!!)
- prototype:一個bean的定義可以有多個實例。
- request:每次http請求都會創建一個bean,該作用域僅在基於web的Spring ApplicationContext情形下有效。
- session:在一個HTTP Session中,一個bean定義對應一個實例。該作用域僅在基於web的Spring ApplicationContext情形下有效。
- global-session:在一個全局的HTTP Session中,一個bean定義對應一個實例。該作用域僅在基於web的Spring ApplicationContext情形下有效。
Q:什么是Spring的內部bean?
當一個bean僅被用作另一個bean的屬性時,它能被聲明為一個內部bean,為了定義inner bean,在Spring 的 基於XML的 配置元數據中,可以在 <property/>或 <constructor-arg/> 元素內使用<bean/> 元素,內部bean通常是匿名的,它們的Scope一般是prototype。

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="person2" class="com.itdjx.spring.dependency.injection.Person"> <property name="name" value="ZH"/> <property name="age" value="25"/> <property name="sex" value="男"/> <property name="car" > <bean class="com.itdjx.spring.dependency.injection.Car"> <constructor-arg value="Audi" index="0"/> <constructor-arg value="德國" index="1"/> <constructor-arg value="300000" type="double"/> </bean> </property> </bean> </beans>
Q:在 Spring中如何注入一個java集合?
Spring提供以下幾種集合的配置元素:
- <list>類型用於注入一列值,允許有相同的值。
- <set> 類型用於注入一組值,不允許有相同的值。
- <map> 類型用於注入一組鍵值對,鍵和值都可以為任意類型。
- <props>類型用於注入一組鍵值對,鍵和值都只能為String類型。
Q:Bean的裝配與自動裝配?
裝配:裝配,或bean 裝配是指在Spring 容器中把bean組裝到一起,前提是容器需要知道bean的依賴關系,如何通過依賴注入來把它們裝配到一起。
自動裝配:Spring 容器能夠自動裝配相互合作的bean,這意味着容器不需要<constructor-arg>和<property>配置,能通過Bean工廠自動處理bean之間的協作。
Q:解釋不同方式的自動裝配?
基於xml
- no:默認的方式是不進行自動裝配,通過顯式設置ref 屬性來進行裝配。
- byName:通過參數名自動裝配,Spring容器在配置文件中發現bean的autowire屬性被設置成byname,之后容器試圖匹配、裝配和該bean的屬性具有相同名字的bean。
- byType:通過參數類型自動裝配,Spring容器在配置文件中發現bean的autowire屬性被設置成byType,之后容器試圖匹配、裝配和該bean的屬性具有相同類型的bean。如果有多個bean符合條件,則拋出錯誤。
- constructor:這個方式類似於byType, 但是要提供給構造器參數,如果沒有確定的帶參數的構造器參數類型,將會拋出異常。
- autodetect:首先嘗試使用constructor來自動裝配,如果無法工作,則使用byType方式。
基於注解
在使用@Autowired注解之前需要在Spring配置文件進行配置:
<context:annotation-config />
- @Autowired默認是按照類型裝配注入的,默認情況下它要求依賴對象必須存在(可以設置它required屬性為false)。
- @Resource默認是按照名稱來裝配注入的,只有當找不到與名稱匹配的bean才會按照類型來裝配注入。
Q:自動裝配的局限性?
- 重寫: 你仍需用 <constructor-arg>和 <property> 配置來定義依賴,意味着總要重寫自動裝配。
- 基本數據類型:你不能自動裝配簡單的屬性,如基本數據類型,String字符串,和類。
- 模糊特性:自動裝配不如顯式裝配精確,如果有可能,建議使用顯式裝配。
Q:並發時對Bean的處理
無狀態的Bean才可以在多線程環境下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域,因為Spring對一些Bean中非線程安全狀態采用ThreadLocal進行處理,解決線程安全問題。
ThreadLocal采用了“空間換時間”的方式,會為每一個線程提供一個獨立的變量副本,從而隔離了多個線程對數據的訪問沖突。
PS:ThreadLocal可用於變量操作相互不影響的情況,不能用於多線程並發時共享變量的場景。
ThreadLocal詳解看這里~
四、Spring注解
Q:什么是基於Java的Spring注解配置? 給一些注解的例子?
基於Java的配置,允許你在少量的Java注解的幫助下,進行你的大部分Spring配置而非通過XML文件。
@Configuration:用來標記類可以當做一個<beans></beans>的定義,被Spring IOC容器使用。
@Bean注解:表示此方法將要返回一個對象,作為一個bean注冊進Spring應用上下文。
Q:怎樣開啟注解裝配?
注解裝配在默認情況下是不開啟的,為了使用注解裝配,我們必須在Spring配置文件中配置 <context:annotation-config/>元素。
Q:@Required 注解
這個注解表明bean的屬性必須在配置的時候設置,通過一個bean定義的顯式的屬性值或通過自動裝配,若@Required注解的bean屬性未被設置,容器將拋出BeanInitializationException。
Q:@Autowired 注解
@Autowired 注解提供了更細粒度的控制,包括在何處以及如何完成自動裝配。它的用法和@Required一樣,修飾setter方法、構造器、屬性或者具有任意名稱和/或多個參數的PN方法。
Q:@Qualifier 注解
當有多個相同類型的bean卻只有一個需要自動裝配時,將@Qualifier 注解和@Autowire 注解結合使用可以消除這種混淆。
原理:指定需要裝配的確切的bean的name屬性,此時相當於按照name進行裝配。
Q:@AutoWired和@Resource的區別
@AutoWired默認以類型進行查找,@Resource默認以名稱進行查找
@AutoWired(required=false) + @Qualifier("user") == @Resource(name="user")
Q:@Component和@Bean的區別是什么
- 作用對象不同。@Component注解作用於類,而@Bean注解作用於方法。
- @Component注解通常是通過類路徑掃描來自動偵測以及自動裝配到Spring容器中(我們可以使用@ComponentScan注解定義要掃描的路徑)。@Bean注解通常是在標有該注解的方法中定義產生這個bean(即方法需要返回一個Bean給Spring容器),告訴Spring這是某個類的實例,當我需要用它的時候還給我。
- @Bean注解比@Component注解的自定義性更強,而且很多地方只能通過@Bean注解來注冊bean。比如當引用第三方庫的類需要裝配到Spring容器的時候,就只能通過@Bean注解來實現。
Q:聲明為Bean的注解有哪些
- @Component注解。通用的注解,可標注任意類為Spring組件。如果一個Bean不知道屬於哪一個層,可以使用@Component注解標注。
- @Repository注解。對應持久層,即Dao層,主要用於數據庫相關操作。
- @Service注解。對應服務層,即Service層,主要涉及一些復雜的邏輯,需要用到Dao層(注入)。
- @Controller注解。對應Spring MVC的控制層,即Controller層,主要用於接受用戶請求並調用Service層的方法返回數據給前端頁面。
五、Spring數據訪問
Q:在Spring框架中如何更有效地使用JDBC
使用SpringJDBC 框架,資源管理和錯誤處理的代價都會被減輕。所以開發者只需寫statements 和 queries從數據存取數據,JDBC也可以在Spring框架提供的模板類的幫助下更有效地被使用,這個模板叫JdbcTemplate。
PS:詳解見Spring JdbcTemplate詳解
Q:JdbcTemplate
JdbcTemplate 類提供了很多便利的方法解決諸如把數據庫數據轉變成基本數據類型或對象,執行寫好的或可調用的數據庫操作語句,提供自定義的數據錯誤處理。
Q:Spring對DAO的支持
Spring對數據訪問對象(DAO)的支持旨在簡化它和數據訪問技術如JDBC,Hibernate or JDO 結合使用。這使我們可以方便切換持久層。編碼時也不用擔心會捕獲每種技術特有的異常
Q:解釋對象/關系映射集成模塊
Spring 通過提供ORM模塊,支持我們在直接JDBC之上使用一個對象/關系映射映射(ORM)工具,Spring 支持集成主流的ORM框架,如Hiberate,JDO和 iBATIS SQL Maps。Spring的事務管理同樣支持以上所有ORM框架及JDBC。
Q:Spring支持的ORM
PS:ORM即對象關系映射,通過使用描述對象和數據庫之間映射的元數據,將面向對象語言程序中的對象自動持久化到關系數據庫中。
JSpring支持以下ORM:
- Hibernate
- iBatis
- JPA (Java Persistence API)
- TopLink
- JDO (Java Data Objects)
- OJB
Q:Spring支持的事務管理類型
Spring支持兩種類型的事務管理:
- 編程式事務管理:這意味你通過編程的方式管理事務,給你帶來極大的靈活性,但是難維護。
- 聲明式事務管理:這意味着你可以將業務代碼和事務管理分離,你只需用注解和XML配置來管理事務。
Q:Spring框架的事務管理有哪些優點?
- 它為不同的事務API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一個不變的編程模式。
- 它為編程式事務管理提供了一套簡單的API而不是一些復雜的事務API
- 它支持聲明式事務管理。
- 它和Spring各種數據訪問抽象層很好得集成。
Q:你更傾向用那種事務管理類型?
大多數Spring框架的用戶選擇聲明式事務管理,因為它對應用代碼的影響最小,因此更符合一個無侵入的輕量級容器的思想。聲明式事務管理要優於編程式事務管理,雖然比編程式事務管理(這種方式允許你通過代碼控制事務)少了一點靈活性。
六、Spring面向切面編程(AOP)
Q:Spring中AOP名詞解釋
- JoinPoint(連接點):指目標對象中,所有可以增強的方法。Spring只支持方法連接點。
- Pointcut(切入點):指目標對象中,已經被增強的方法。調用這幾個方法之前、之后或者拋出異常時干點什么,那么就用切入點來定義這幾個方法。
- Advice(通知/增強) :增強方法的代碼、想要的功能。
- Target(目標對象):被代理對象,被通知的對象,被增強的類對象。
- Weaving(織入):將通知應用到連接點形成切入點的過程。
- Proxy(代理):將通知織入到目標對象之后形成的代理對象
- Aspect(切面):切入點+通知————通知(Advice)說明了干什么的內容(即方法體代碼)和什么時候干(什么時候通過方法名中的before,after,around等就能知道),二切入點說明了在哪干(指定到底是哪個方法),切點表達式等定義。
Q:Aspect 切面?
AOP核心就是切面,它將多個類的通用行為封裝成可重用的模塊,該模塊含有一組API提供橫切功能。比如,一個日志模塊可以被稱作日志的AOP切面。根據需求的不同,一個應用程序可以有若干切面。在Spring AOP中,切面通過帶有@Aspect注解的類實現。
Q:在Spring AOP 中,關注點和橫切關注的區別是什么?
關注點是應用中一個模塊的行為,一個關注點可能會被定義成一個我們想實現的一個功能。橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,並影響整個應用,比如日志,安全和數據傳輸,幾乎應用的每個模塊都需要的功能。因此這些都屬於橫切關注點。
Q:連接點
連接點代表一個應用程序的某個位置,在這個位置我們可以插入一個AOP切面,它實際上是個應用程序執行Spring AOP的位置。
Q:通知
通知是個在方法執行前或執行后要做的動作,實際上是程序執行時要通過SpringAOP框架觸發的代碼段。
Spring切面可以應用五種類型的通知:
- before:前置通知,在一個方法執行前被調用。
- after: 在方法執行之后調用的通知,無論方法執行是否成功。
- after-returning: 僅當方法成功完成后執行的通知。
- after-throwing: 在方法拋出異常退出時執行的通知。
- around: 在方法執行之前和之后調用的通知。
Q:切點
切入點是一個或一組連接點,通知將在這些位置執行。可以通過表達式或匹配的方式指明切入點。
Q:什么是引入?
引入允許我們在已存在的類中增加新的方法和屬性。
Q:什么是目標對象?
被一個或者多個切面所通知的對象。它通常是一個代理對象。也指被通知(advised)對象。
Q:什么是代理?
代理是通知目標對象后創建的對象。從客戶端的角度看,代理對象和目標對象是一樣的。
Q:什么是織入。什么是織入應用的不同點?
織入是將切面和到其他應用類型或對象連接或創建一個被通知對象的過程。
織入可以在編譯時,加載時,或運行時完成。
Q:解釋基於XML Schema方式的切面實現
在這種情況下,切面由常規類以及基於XML的配置實現。
Q:解釋基於注解的切面實現
在這種情況下(基於@AspectJ的實現),涉及到的切面聲明的風格與帶有java5標注的普通java類一致。
七、Spring 的MVC
Q:什么是Spring的MVC框架?
Spring 配備構建Web 應用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts,Spring 的MVC框架用控制反轉把業務對象和控制邏輯清晰地隔離。它也允許以聲明的方式把請求參數和業務對象綁定。
Q:DispatcherServlet
Spring的MVC框架是圍繞DispatcherServlet來設計的,它用來處理所有的HTTP請求和響應。
Q:WebApplicationContext
WebApplicationContext 繼承了ApplicationContext 並增加了一些WEB應用必備的特有功能,它不同於一般的ApplicationContext ,因為它能處理主題,並找到被關聯的servlet。
Q:什么是Spring MVC框架的控制器?
控制器提供一個訪問應用程序的行為,此行為通常通過服務接口實現。控制器解析用戶輸入並將其轉換為一個由視圖呈現給用戶的模型。Spring用一個非常抽象的方式實現了一個控制層,允許用戶創建多種用途的控制器。
Q:@Controller 注解
該注解表明該類扮演控制器的角色,Spring不需要你繼承任何其他控制器基類或引用Servlet API。
Q:@RequestMapping 注解
該注解是用來映射一個URL到一個類或一個特定的方處理法上。
Q:MVC的分層結構
前端:
- View層(頁面展示)
- VO層(數據傳遞對象)
后端:
- Service層(處理業務)
- Dao層(數據庫操作)
- Entity層(實體類)
- Controller層(控制層,返回數據給前台頁面)
Q:MVC的工作原理
八、Spring 的事務
Q:事務的特性
- 原子性(Atomicity):事務是一個原子操作,由一系列動作組成。事務的原子性確保動作要么全部完成,要么完全不起作用。
- 一致性(Consistency):一旦事務完成(不管成功還是失敗),系統必須確保它所建模的業務處於一致的狀態,而不會是部分完成部分失敗。在現實中的數據不應該被破壞。
- 隔離性(Isolation):可能有許多事務會同時處理相同的數據,因此每個事務都應該與其他事務隔離開來,防止數據損壞。
- 持久性(Durability):一旦事務完成,無論發生什么系統錯誤,它的結果都不應該受到影響,這樣就能從任何系統崩潰中恢復過來。通常情況下,事務的結果被寫到持久化存儲器中。
Q:Spring事務的種類
Spring支持編程式事務管理和聲明式事務管理兩種方式:
- 編程式事務:使用TransactionTemplate,在代碼中硬編碼(不推薦使用)。
- 聲明式事務:建立在AOP之上的,在配置文件中配置(推薦使用),分為基於XML的聲明式事務和基於注解的聲明式事務。
小結:
聲明式事務最大的優點就是不需要在業務邏輯代碼中摻雜事務管理的代碼,其本質是通過AOP功能,對方法前后進行攔截,將事務處理的功能編織到攔截的方法中,也就是在目標方法開始之前加入一個事務,在執行完目標方法之后根據執行情況提交或者回滾事務,只需在配置文件中做相關的事務規則聲明或通過@Transactional注解的方式,便可以將事務規則應用到業務邏輯中。
聲明式事務管理要優於編程式事務管理,這正是spring倡導的非侵入式的開發方式,使業務代碼不受污染,只要加上注解就可以獲得完全的事務支持。唯一不足地方是,最細粒度只能作用到方法級別,無法做到像編程式事務那樣可以作用到代碼塊級別。
Q:Spring事務的隔離級別
在TransactionDefinition接口中定義了五個表示隔離級別的常量:
- ISOLATION_DEFAULT:使用后端數據庫默認的隔離級別,Mysql默認采用的REPEATABLE_READ隔離級別;Oracle默認采用的READ_COMMITTED隔離級別。
- ISOLATION_READ_UNCOMMITTED:最低的隔離級別,允許讀取尚未提交的數據變更,可能會導致臟讀、幻讀或不可重復讀。
- ISOLATION_READ_COMMITTED:允許讀取並發事務已經提交的數據,可以阻止臟讀,但是幻讀或不可重復讀仍有可能發生
- ISOLATION_REPEATABLE_READ:對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止臟讀和不可重復讀,但幻讀仍有可能發生。
- ISOLATION_SERIALIZABLE:最高的隔離級別,完全服從ACID的隔離級別。所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。
Q:Spring事務的傳播行為
在TransactionDefinition接口中定義了七個表示事務傳播行為的常量。
支持當前事務的情況:
PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。
PROPAGATION_SUPPORTS: 如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
PROPAGATION_MANDATORY: 如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。(mandatory:強制性)。
不支持當前事務的情況:
PROPAGATION_REQUIRES_NEW: 創建一個新的事務,如果當前存在事務,則把當前事務掛起。
PROPAGATION_NOT_SUPPORTED: 以非事務方式運行,如果當前存在事務,則把當前事務掛起。
PROPAGATION_NEVER: 以非事務方式運行,如果當前存在事務,則拋出異常。
其他情況:
PROPAGATION_NESTED: 如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價於PROPAGATION_REQUIRED。
參考資料:
- Spring框架總結(特此感謝!)
- Spring容器中Bean的生命周期(特此感謝!)
- 69道Spring面試題和答案 (特此感謝!)
- Spring常見面試題總結(超詳細回答) (特此感謝!)
- Spring經典面試題(特此感謝!)