Ioc的理解和事務管理器
1、依賴注入的概念
spring的兩個核心概念:一個是控制反轉IoC,也可以叫做依賴注入DI。還有一個是面向切面程式設計AOP。
控制反轉:當某個java物件需要(依賴)另一個java物件時,不是自身直接建立依賴物件,而是由實現IoC的容器(如spring框架的IoC容器)來建立,並將它注入需要這個依賴物件的java物件中。
2、spring的依賴注入
2.1、構造器注入
<bean id="accoutDaoImpl"class="cn.csdn.dao.AccoutDaoImpl" scope=”singleton”/>
<bean id="accoutServicImpl"class="cn.csdn.service.AccoutServicImpl" scope=”">
<!-- 構造器注入方式-->
<constructor-argref="accoutDaoImpl"/></bean>
2.2、設值(set方法)注入
<bean id="accountDaoImpl"class="cn.csdn.dao.AccoutDaoImpl"/>
<bean id="accoutServicImpl"class="cn.csdn.service.AccoutServicImpl">
<!-- 設值(set方法)注入 -->
<property name="accountDaoImpl"ref="accoutDaoImpl"/> </bean>
3、spring的容器
spring管理的基本單元是Bean,在spring的應用中,所以的元件都是一個個的Bean,它可以是任何的java物件。spring負責建立這些Bean的例項。並管理生命週期。而spring框架是通過其內建的容器來完成Bean的管理的,Bean在spring的容器中生存著,使用時只需要通過它提供的一些方法從其中獲取即可。
spring的容器有兩個介面:BeanFactory和ApplicationContext 這兩個介面的例項被陳為spring的上下文。
ApplicationContext ac = new ClassFathXmlApplicationContext("app*.xml");
AccountService accountService = (AccountService)ac.getBean("accountServiceImpl");
4、使用xml裝配Bean
4.1、自動裝配
no:不使用自動裝配。必須通過ref元素指定依賴,這是預設設定。由於顯式指定協作者可以使配置更靈活、更清晰,因此對於較大的部署配置,推薦採用該設定。而且在某種程度上,它也是系統架構的一種文件形式。
<bean id="bean1"class="cn.csdn.service.Bean1" scope="singleton">
<property name="studentDaoImpl"ref="studentDaoImpl">
</property></bean>
備註:有property屬性 指定ref
byName:根據屬性名自動裝配。此選項將檢查容器並根據名字查詢與屬性完全一致的bean,並將其與屬性自動裝配。例如,在bean定義中將autowire設定為byname,而該bean包含master屬性(同時提供setMaster(..)方法),Spring就會查詢名為master的bean定義,並用它來裝配給master屬性。
<bean id="bean1"class="cn.csdn.service.Bean1" scope="singleton"autowire="byName"/>
備註:沒有property屬性
byType:如果容器中存在一個與指定屬性型別相同的bean,那麼將與該屬性自動裝配。如果存在多個該型別的bean,那麼將會丟擲異常,並指出不能使用byType方式進行自動裝配。若沒有找到相匹配的bean,則什麼事都不發生,屬性也不會被設定。如果你不希望這樣,那麼可以通過設定dependency-check="objects"讓Spring丟擲異常。
備註:spring3.0以上不拋異常。
4.4、指定Bean的存在範圍
singleton:在每個Spring IoC容器中一個bean定義對應一個物件例項。這是預設值
prototype:每次對Bean請求時都會建立一個Bean定義對應一個例項。一個Bean定義多個例項。
request:在一次HTTP請求中,一個bean定義對應一個例項;即每次HTTP請求將會有各自的bean例項, 它們依據某個bean定義建立而成。該作用域僅在基於web的Spring ApplicationContext情形下有效。
session:在一個HTTP Session中,一個bean定義對應一個例項。該作用域僅在基於web的Spring ApplicationContext情形下有效。
global_session:在一個全域性的HTTP Session中,一個bean定義對應一個例項。
典型情況下,僅在使用portlet context的時候有效。該作用域僅在基於web的Spring ApplicationContext情形下有效。
4.5、指定Bean的初始化和銷燬
Spring可以管理Bean例項在例項化結束之後和被銷燬之前的行為。通過property的init-method屬性可以指定某個方法應該在Bean全部依賴關係設定結束後自動執行;通過property的destroy-method屬性可以指定某個方法應該在Bean被銷燬之前自動執行。
4.6、裝配Bean的繼承
如果兩個Bean的屬性裝配資訊很相似,那麼可以利用繼承來減少重複的配置工作。
<!-- 裝配Bean的繼承父類作為模板,不需要例項化,設定abstract=”true”-->
<bean id=”parent” class=”cn.csdn.service.Parent”abstract=”true”>
<property name=”name” value=”z_xiaofei168”/>
<property name=”pass”value=”z_xiaofei168”/></bean>
<!-- 裝配Bean的繼承子類中用parent屬性指定父類標識或別名子類可以覆蓋父類的屬性裝配,也可以新增自己的屬性裝配-->
<bean id=”child” class=”cn.csdn.service.Chlid”parent=”parent”>
<property name=”pass” value=”123123”/>
<propertyname=”age” value=”22”/></bean>
spring的事務管理器
Spring框架並沒有直接管理使用者的應用系統中的事務,它只是提供許多供使用者選擇的事務管理器,然後將事務管理的責任委託給與此事務管理器對應的持久化技術的事務實現。
事務管理實現 |
使用時機 |
org.springframework.jdbc.datasource. DataSourceTransactionManager |
在單一的JDBC DataSource中管理事務 |
org.springframework.orm.hibernate3. HibernateTransactionManager |
當持久化機制是Hibernate時,用它來管理職務 |
org.springframework.orm. jpa.JpaTransactionManager |
當JPA用作持久化時,用它來管理職務 |
org.springframework.transaction. jta.JtaTransactionManager |
使用一個JTA實現來管理事務。在一個事務跨越多個資源時必須使用 |
事務屬性介紹
1>.傳播行為(7個)
傳播行為 |
說明 |
PROPAGATION_REQUIRED |
必須在一個事務中執行。如果當前有一個事務正在進行,該方法將會在那個事務中執行。否則要開始一個新事務。Spring事務傳播行為的預設值。 |
PROPAGATION_SUPPORTS |
支援現有的事務。如果當前沒有事務在進行,就以非事務的方式執行 |
PROPAGATION_MANDATORY |
方法必須在一個現有事務中進行,否則會丟擲異常。 |
PROPAGATION_REQUIRES_NEW |
必須在它自己的新啟事務裡進行。如果現有事務在進行就先暫停它 |
PROPAGATION_NOT_SUPPORTED |
不應在事務中進行。如果現有事務在進行就先暫停它 |
PROPAGATION_NEVER |
不應在事務中進行。如果現有事務在進行就丟擲異常 |
PROPAGATION_NESTED |
如果現有事務正在進行,則該方法執行在一個巢狀式事務中。否則PROPAGATION_REQUIRED執行 |
2>.隔離級別(5個)
隔離級別 |
說明 |
ISOLATION_DEFAULT |
使用底層資料庫預設的隔離級別spring事務隔離級別的預設值 |
ISOLATION_READ_UNCOMMITED |
充許另一個事務可以讀到這個事務未提交的資料可能導致髒讀、不可重複讀和幻讀。 |
ISOLATION_READ_COMMITED |
保證一個事務修改的資料提交後才能被另一個事務讀取可能導致不可重複讀和幻讀。 |
ISOLATION_REPEATABLE_READ |
要求對相同欄位的多次讀取的結果必須相同,除非事務本身更新了資料可能導致幻讀。 |
ISOLATION_SERIALIZABLE |
事務被處理為順序執行可以防止髒讀、不可重複讀、幻讀。 |
3>.只讀提示
如果事務只對後端資料進行讀操作,則後端資料庫可以採用一些優化措施來提高執行效率。但必須在事務中才有效。也就是說要搭配傳播行為PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW,PROPAGATION_NESTED 來設定。
4>.事務超時間隔
還可以設定事務的超時間隔,讓事務在特定秒數後自動回滾,不必等它自己結束。由於計時是從事事務開始時算起的,所以它也得搭配傳播行為為 PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW,PROPAGATION_NESTED 來設定。
5>.回滾規則
當事務執行過程中丟擲異常時,事務可以被宣告為回滾或者不回滾。預設情況下只在出現RuntimeException才會回滾,而在出現受檢異常時不回滾。
當然,也可以改變這種回滾規則,可以宣告一個事務在出現特定的受檢異常時能回滾。也可以宣告一個事務在出現特定的非受檢異常時不回滾。