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);
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值