Spring框架學習二(AOP事務)

Spring框架學習二(AOP事務配置)

​ 由於框架的不同相應事務的操作代碼不相同,故在Spring的事務處理中,通用的事務處理流程框架是由抽象事務管理器AbstractPlatformTransactionManager來提供的,而具體的底層事務處理實現,由PlatformTransactionManager的具體實現類來實現,如 DataSourceTransactionManager 、JtaTransactionManager和 HibernateTransactionManager等。

有關於事務的屬性(隔離級別)

1.AOP配置方式一:XML(aop)

​ 首先導入約束文件:spring-tx.xsd (事務的約束文件)

<tx:annotation-driven/> 就是支持事務註解的(@Transactional)

1.配置事務的核心管理器

<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!-- 這裏面的dataSource需自己定義。這裏就不定義了-->
		<property name="dataSource" ref="dataSource" />
	</bean>

2.定義事務的策略

<!-- 定義事務策略 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<!--定義查詢方法都是隻讀的 -->
			<tx:method name="query*" read-only="true" />
			<tx:method name="find*" read-only="true" />
			<tx:method name="get*" read-only="true" />

			<!-- 主庫執行操作,事務傳播行爲定義爲默認行爲 -->
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="delete*" propagation="REQUIRED" />

			<!--其他方法使用默認事務策略 -->
			<tx:method name="*" />
		</tx:attributes>
	</tx:advice>

3.配置service的目標對象

<!-- 配置Service目標對象 -->
<bean name="acountService"class="Service.AcountServiceImp">
</bean>

4.配置切面並將事務的策略應用到切面

<!-- 配置織入 -->
	<aop:config>
        <!-- 配置切面 Service包中所有以service結尾的類中的所有方法-->
		<aop:pointcut expression="execution(* Service.*Service.*(..))" id="pc"/>
        <!-- 然後我們用一個通知器:<aop:advisor/>把這個切面和tx:advice綁定在一起,表示當這個切面執行時,tx:advice定義的通知邏輯將被執行 -->  
		<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
	</aop:config>

2.AOP配置方式二:註解方式

​ 使用註解方式配置的話和xml大致相同 不需要手動配置織入,但是需要添加一個標籤支持事務註解

<!-- 開啓註解 transaction-manager屬性來指定使用哪個事務管理器-->
<tx:annotation-driven transaction-manager="transactionManager"/>

	<!-- 配置事務核心管理器 (封裝了對事務操作的方法)-->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
	<property name="dataSource" ref="dataSource" ></property>
	</bean>
	<!-- 配置Service目標對象 -->
	<bean name="acountService" class="Service.AcountServiceImp">
		<property name="ad" ref="acount"></property>
	</bean>
	
	<!-- 將AcountDao對象注入容器 -->
	<bean name="acount" class="Dao.AcountDao">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

Service.AcountServiceImp

import Dao.AcountDao;

public class AcountServiceImp implements AcountService{
    //dao層對象
	private AcountDao ad;
	
	/*使用註解配置AOP事務
		isolation:事務的隔離級別
		propagation:事務的傳播行爲
		readOnly:是否只讀
		也可以添加在類上表示此類中的所有方法都是註解中的策略
	*/
@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)
	public void transfer(int from, int to, double money) {
		ad.decrease(from, money);
//		int i=1/0;
		ad.increase(to, money);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章