一、事務的傳播行為:通過Propagation定義:
<!-- 配置事務通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager" > <tx:attributes> <!-- 以方法為單位,指定方法應用什么事務屬性:
isolation:隔離級別 propagation:傳播行為 read-only:是否只讀--> <tx:method name="transfer" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/> <!--上面的方式只適用單個方法,當我們業務有很多個方法都要操作事務時,則要配置很多個,可以使用下面的通配符配置方式--> <tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" /> 省略update.. detele..... </tx:attributes> </tx:advice>
readOnly:
事務屬性中的readOnly標志表示對應的事務應該被最優化為只讀事務。這是一個最優化提示 。
在一些情況下,一些事務策略能夠起到顯著的最優化效果,例如在使用Object/Relational映射工具 (如:hibernate或TopLink)時避免dirty checking(試圖“刷新”)。
spring中的事務隔離級別?
spring的事務隔離級別其實本質上是對SQL標准的4種事務隔離級別的一種封裝。
什么是臟數據,臟讀,不可重復讀,幻覺讀?
臟讀::指當一個事務正在訪問數據,並且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,
另外一個事務也訪問這個數據,然后使用了這個數據。 那么另外一個事務讀到的這個數據是臟數據。
不可重復讀:指在一個事務內,多次讀同一數據。在這個事務還沒有結束時,另外一個事務也更新了該同一數據。
那么,在第一個事務中的兩次讀數據之間,由於第二個事務的修改,那么第一個事務兩次讀到的數據
可能是不一樣的。這樣就發生了在一個事務內兩次讀到的數據是不一樣的,因此稱為是不可重復讀。
幻讀:當第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。同時,第二個事務是向表中插入一行新數據。那么,以后就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺一樣。
Spring事務的實現方式和實現原理?
1、方式:Spring事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,spring是無法提供事務功能的。
2、原理:真正的數據庫層的事務提交和回滾是通過binlog或者redo log實現的。
spring支持編程式事務管理和聲明式事務管理兩種方式:
第一種:編程式事務管理:在xml配置注入TransactionTemplate的bean,在service服務代碼調用TransactionTemplate。
第二種:聲明式事務管理建立在AOP之上的。(在 xml配置aop切面,核心事務管理器:transactionManager)
其本質是通過AOP功能,對方法前后進行攔截,將事務處理的功能編織到攔截的方法中,也就是在目標方法開始之前加入一個事務,在執行完目標方法之后根據執行情況提交或者回滾事務。
第三種:注解配置aop。開啟注解管理事務。導入約束:transactionManager。
@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRED,readOnly = false) public void transfer(Integer from,Integer to, Double money) {
1、划分處理單元ioc:
由於spring解決的問題是對單個數據庫進行局部事務處理的,具體的實現首先用spring中的IoC划分了事務處理單元。並且將對事務的各種配置放到了ioc容器中(設置事務管理器,設置事務的傳播特性及隔離機制)。
2、AOP攔截需要進行事務處理的類:
Spring事務處理模塊是通過AOP功能來實現聲明式事務處理的,具體操作(比如事務實行的配置和讀取,事務對象的抽象),用TransactionProxyFactoryBean接口來使用AOP功能,生成proxy代理對象,通過TransactionInterceptor完成對代理方法的攔截,將事務處理的功能編織到攔截的方法中。
3、對事務處理實現:
(事務的生成、提交、回滾、掛起)spring委托給具體的事務處理器實現。實現了一個抽象和適配。適配的具體事務處理器:DataSource數據源支持、hibernate數據源事務處理支持。這些支持都是通過設計PlatformTransactionManager、AbstractPlatforTransaction一系列事務處理的支持。為常用數據源支持提供了一系列的TransactionManager。
4、整合:
PlatformTransactionManager實現了TransactionInterception接口,讓其與TransactionProxyFactoryBean結合起來,形成一個Spring聲明式事務處理的設計體系。
1、Spring Beans是構成Spring應用核心的Java對象。這些對象由Spring IOC容器實例化、組裝、管理。這些對象通過容器中配置的元數據創建,例如,使用XML文件中定義的創建。
2、在Spring中創建的beans都是單例的beans。在bean標簽中有一個屬性為”singleton”,如果設為true,該bean是單例的,如果設為false,該bean是原型bean。Singleton屬性默認設置為true。因此,spring框架中所有的bean都默認為單例bean。
Spring 的單例實現原理?
Spring框架對單例的支持是采用單例注冊表的方式進行實現的,而這個注冊表的緩存是HashMap對象。
如果配置文件中的配置信息不要求使用單例,Spring會采用新建實例的方式返回對象實例。
解釋Spring框架中bean的生命周期?
1.首先容器啟動后,會對scope為singleton且非懶加載的bean進行實例化,
2.按照Bean定義信息配置信息,注入所有的屬性,
3.如果Bean實現了BeanNameAware接口,會回調該接口的setBeanName()方法,傳入該Bean的id,此時該Bean就獲得了自己在配置文件中的id,
4.如果Bean實現了BeanFactoryAware接口,會回調該接口的setBeanFactory()方法,傳入該Bean的BeanFactory,這樣該Bean就獲得了自己所在的BeanFactory,
5.如果Bean實現了ApplicationContextAware接口,會回調該接口的setApplicationContext()方法,傳入該Bean的ApplicationContext,這樣該Bean就獲得了自己所在的ApplicationContext,
6.如果有Bean實現了BeanPostProcessor接口,則會回調該接口的postProcessBeforeInitialzation()方法,
7.如果Bean實現了InitializingBean接口,則會回調該接口的afterPropertiesSet()方法,
8.如果Bean配置了init-method方法,則會執行init-method配置的方法,
9.如果有Bean實現了BeanPostProcessor接口,則會回調該接口的postProcessAfterInitialization()方法,
10.經過流程9之后,就可以正式使用該Bean了,對於scope為singleton的Bean,Spring的ioc容器中會緩存一份該bean的實例,而對於scope為prototype的Bean,每次被調用都會new一個新的對象,期生命周期就交給調用方管理了,不再是Spring容器進行管理了
11.容器關閉后,如果Bean實現了DisposableBean接口,則會回調該接口的destroy()方法,
12.如果Bean配置了destroy-method方法,則會執行destroy-method配置的方法,至此,整個Bean的生命周期結束
Resource 是如何被查找、加載的?
Resource 接口是 Spring 資源訪問策略的抽象,它本身並不提供任何資源訪問實現,具體的資源訪問由該接口的實現類完成——每個實現類代表一種資源訪問策略。Spring 為 Resource 接口提供了如下實現類:
1、UrlResource:訪問網絡資源的實現類。
2、ClassPathResource:訪問類加載路徑里資源的實現類。
3、FileSystemResource:訪問文件系統里資源的實現類。
4、ServletContextResource:訪問相對於 ServletContext 路徑里的資源的實現類。
5、InputStreamResource:訪問輸入流資源的實現類。
6、ByteArrayResource:訪問字節數組資源的實現類。
這些 Resource 實現類,針對不同的的底層資源,提供了相應的資源訪問邏輯,並提供便捷的包裝,以利於客戶端程序的資源訪問。
解釋自動裝配的各種模式?
自動裝配提供五種不同的模式供Spring容器用來自動裝配beans之間的依賴注入:
no:默認的方式是不進行自動裝配,通過手工設置ref 屬性來進行裝配bean。
byName:通過參數名自動裝配,Spring容器查找beans的屬性,這些beans在XML配置文件中被設置為byName。之后容器試圖匹配、裝配和該bean的屬性具有相同名字的bean。
byType:通過參數的數據類型自動自動裝配,Spring容器查找beans的屬性,這些beans在XML配置文件中被設置為byType。之后容器試圖匹配和裝配和該bean的屬性類型一樣的bean。如果有多個bean符合條件,則拋出錯誤。
constructor:這個同byType類似,不過是應用於構造函數的參數。如果在BeanFactory中不是恰好有一個bean與構造函數參數相同類型,則拋出一個嚴重的錯誤。
autodetect:如果有默認的構造方法,通過 construct的方式自動裝配,否則使用 byType的方式自動裝配。
有那些哪種依賴注入?選擇構造器依賴注入還是Setter方法依賴注入?
構造器注入,set注入,接口注入。
你可以同時使用兩種方式的依賴注入,最好的選擇是使用構造器參數實現強制依賴注入,使用setter方法實現可選的依賴關系。
Spring IOC 如何實現?
Spring中的 org.springframework.beans 包和 org.springframework.context包構成了Spring框架IoC容器的基礎。
BeanFactory 接口提供了一個先進的配置機制,使得任何類型的對象的配置成為可能。ApplicationContex接口對BeanFactory(是一個子接口)進行了擴展,在BeanFactory的基礎上添加了其他功能,比如與Spring的AOP更容易集成,也提供了處理message resource的機制(用於國際化)、事件傳播以及應用層的特別配置,比如針對Web應用的WebApplicationContext。
org.springframework.beans.factory.BeanFactory 是Spring IoC容器的具體實現,用來包裝管理各種bean。BeanFactory接口是Spring IoC 容器的核心接口。