S++

千线一眼

导航

Spring-声明事务控制

实质上仍然是AOP思想

xml配置事务增强

以转账为例:
转账方法是切点,事务控制是通知
引入spring-tx:

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.3.17</version>
    </dependency>

配置事务增强:

    <bean id="accountDao" class="xxx.accountDao">
        <property name="jdbcTemplate" ref="jdbcTemplate" />
    </bean>

    <!--目标对象 内部的方法就是切点-->
    <bean id="accountService" class="xxx.accountServiceImpl">
        <property name="accountDao" ref="accountDao">
    </bean>

    <!--配置平台事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <!--通知 事务的增强-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
          <!-- * 代表任意方法-->
          <!--name:切点方法名称。 isolation:事务的隔离级别。 propagation:事务的传播行为。 timeout:超出时间。 read-only:是否只读。-->
          <tx:method name="*" />
        </tx:attributes>
    </tx:advice>

    <!--配置事务的aop织入-->
        <aop:config>
        <!--声明切片切点-->
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* 包名.*.*(..))" />
    </aop:config>

注释配置事务增强

@Repository("xxxDao") // dao类

@Service("xxxService") // service类

// 参数和上述xml中的tx:method一致,需要可自行添加
@Transactional() // 使用在需要事务增强的方法上

你还需要配置组件扫描和事务的注解驱动

    <!--组件扫描-->
    <context:component-scan base-package="包名"/>

    <!--配置平台事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--注解驱动-->
    <tx:annotation-driven transaction-manager="transactionManager" />

posted on 2022-04-07 09:19  S++  阅读(17)  评论(0)    收藏  举报