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