Day7 Spring事务管理(2)

Spring事务使用

基于bean配置的事务

事务相关bean:
DataSourceTransactionManager:JDBC 事务管理器,提供事务管理。
TransactionProxyFactoryBean:事务管理相关的代理工厂类。

xml配置参考:

<!--    配置druid数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="jdbc:mysql://localhost:3306/test"/>
        <property name="username" value="root" />
        <property name="password" value="root" />
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
    </bean>
    
<!--    sql操作模板类-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>

<!--    JDBC 事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    
<!--    DAO 层-->
    <bean id="accountDao" class="com.bailiban.day6.beanxml.AccountDao">
        <property name="jdbcTemplate" ref="jdbcTemplate" />
    </bean>

<!--    Service层-->
    <bean id="accountService" class="com.bailiban.day6.beanxml.AccountService">
        <property name="accountDao" ref="accountDao" />
    </bean>

<!--    动态代理-->
    <bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <!--    指定事务管理器-->
        <property name="transactionManager" ref="transactionManager" />
        <!--    指定代理对象-->
        <property name="target" ref="accountService" />
        <!--    指定事务属性 -->
        <property name="transactionAttributes">
            <props>
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>

示例代码见:https://github.com/Jun67/spring-demo/tree/master/src/main/java/com/bailiban/day5/transaction/transfer/bean

基于拦截器的事务

相关bean:

  • TransactionInterceptor: 事务拦截器;
  • BeanNameAutoProxyCreator:自动生成代理,在前述AOP示例代码https://github.com/Jun67/spring-demo/tree/master/src/main/java/com/bailiban/day4/aop/spring12/autoproxy 中,我们使用过该类;

xml配置参考:

    <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="transactionAttributes">
            <props>
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>

    <bean id="serviceProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames" value="*Service" />
        <property name="interceptorNames" value="transactionInterceptor" />
    </bean>

示例代码见:https://github.com/Jun67/spring-demo/tree/master/src/main/java/com/bailiban/day5/transaction/transfer/interceptor

基于tx标签的事务

相关标签:

  • <tx:advice>:配置事务;
    • id:配置id;
      • transaction-manager:指定事务管理器;
    • <tx:attributes>:配置事务属性;
      • <tx:method>:对具体方法配置事务属性,Spring事务属性见下一小节;

xml配置参考:

    <tx:advice id="transactionInterceptor" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:advisor advice-ref="transactionInterceptor" pointcut="execution(* com..bean.AccountService.*(..))" />
    </aop:config>

示例代码见:https://github.com/Jun67/spring-demo/tree/master/src/main/java/com/bailiban/day5/transaction/transfer/tx

基于注解的事务

相关注解:

  • @Transactional:使用在类或者方法上,增加事务功能;
  • @EnableTransactionManagement:开启事务管理;

示例代码见:https://github.com/Jun67/spring-demo/tree/master/src/main/java/com/bailiban/day5/transaction/transfer/annotation

Spring事务属性

猜你喜欢

转载自www.cnblogs.com/cheng18/p/12117055.html