spring事务管理之声明式事务管理

参考前一篇文章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,如果需要管理的类比较多,那么会导致写满了文件复杂,不利于后期维护。

猜你喜欢

转载自blog.csdn.net/ysmbdjglww/article/details/81231863