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);
}
}