参考前一篇文章spring事务管理之编程式事务管理
其dao层没有发生变化,具体逻辑也与之前的是相同的,只是对xml和service文件进行了一些更改。
<!--引入外部的属性文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource02" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--配置业务层-->
<bean id="accountService02" class="per.hss.trans02.AccountServiceImpl">
<property name="transDao" ref="transDao02"/>
</bean>
<!--配置Dao层-->
<!--这个是将连接池直接进行注入 就不用再dao层进行引用了-->
<bean id="transDao02" class="per.hss.trans02.TransDaoImpl">
<property name="dataSource" ref="dataSource02"/>
</bean>
<!--配置事务管理器-->
<bean id="transactionManager02" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource02"/>
</bean>
<!--配置业务层的代理-->
<!--对于这种方式进行配置的,很不方便,一个事务可能就需要配置这么一个bean ,如果事务繁杂的话 可能会很麻烦 -->
<bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!--配置目标对象 因为是要对service产生代理-->
<property name="target" ref="accountService02"/>
<!--注入事务管理器-->
<property name="transactionManager" ref="transactionManager02"/>
<!--用事务管理器进行管理的时候 ,需要配置属性 ,隔离级别、传播行为等进行事物属性的注入-->
<property name="transactionAttributes">
<props>
<!--prop的格式:
* PROPAGATION :事务的传播行为
* ISOLATION :事物的隔离级别
* readyOnly :只读
* -Exception :发生哪些异常回滚事务
* +Exception :发生哪些异常事务不进行回滚
-->
<prop key="trans">
PROPAGATION_REQUIRED
</prop>
</props>
</property>
</bean>
进行声明式事务管理的时候可以不用再service进行事务管理模板的注入。
public class AccountServiceImpl implements AccountService {
/**
* 注入dao层中的
*/
private TransDao transDao;
public void setTransDao(TransDao transDao) {
this.transDao = transDao;
}
/**
*
* @param out:转出账号
* @param in:传入账号
* @param money:交易金额
*/
@Override
public void trans(final String out, final String in,final Double money)
{
transDao.inMoney(in,money);
/* int i=1/0;*/
transDao.outMoney(out,money);
}
}
还要注意的是,由于进行事务管理的类已经变为accountServiceProxy,所以在测试的时候获取bean要采用如下方式:
AccountService service=(AccountService) applicationContext.getBean("accountServiceProxy");
关于这种运用TransactionProxyFactoryBean进行编程式事物管理来说,需要对每一个类进行配置bean,在配置其TransactionProxyFactoryBean,如果需要管理的类比较多,那么会导致写满了文件复杂,不利于后期维护。