zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Spring: 配置声明式事务

2023-09-11 14:16:16 时间

XML:

bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
                           http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">

  <!--配置组件扫描-->
  <context:component-scan base-package="io.oar"/>
  
  <!--数据库连接池-->
  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/java"/>
    <property name="username" value="root"/>
    <property name="password" value="coalesce"/>
  </bean>

  <!--配置JdbcTemplate对象-->
  <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <!--注入数据源-->
    <property name="dataSource" ref="dataSource"/>
  </bean>

  <!--创建事务管理器-->
  <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!--配置数据源-->
    <property name="dataSource" ref="dataSource"/>
  </bean>

  <!--开启事务注解-->
  <!--<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>-->
  
  <!--配置通知-->
  <tx:advice id="transactionInterceptor" transaction-manager="dataSourceTransactionManager">
    <!--配置事务属性-->
    <tx:attributes>
      <tx:method name="change" propagation="REQUIRED" read-only="false" isolation="REPEATABLE_READ"/>
      <!--<tx:method name="change*"/>-->
    </tx:attributes>
  </tx:advice>

  <!--配置aop-->
  <aop:config>
    <!--配置切入点-->
    <aop:pointcut id="pointcut" expression="execution(* io.oar.service.CooService.*())"/>
    <!--配置切面-->
    <aop:advisor advice-ref="transactionInterceptor" pointcut-ref="pointcut"/>
  </aop:config>
</beans>

 

配置类注解方式:

package io.oar.config;


import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@Configuration  // 配置类
@ComponentScan(basePackages = "io.oar")  // 组件扫描
@EnableTransactionManagement  // 开启事务
public class Config {
  // 创建数据库连接池
  @Bean(value = {"aaa","bbb"})  // bean name: aaa, bbb
  public DruidDataSource getDruidDataSource(){
    DruidDataSource druidDataSource = new DruidDataSource();
    druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    druidDataSource.setUrl("jdbc:mysql://localhost:3306/java");
    druidDataSource.setUsername("root");
    druidDataSource.setPassword("coalesce");
    return druidDataSource;
  }

  @Bean
  public JdbcTemplate getJdbcTemplate(DataSource dataSource){  // 根据类型从IOC容器找到dataSource
    JdbcTemplate jdbcTemplate = new JdbcTemplate();
    // 注入DataSource
    jdbcTemplate.setDataSource(dataSource);
    return jdbcTemplate;
  }

  @Bean
  public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
    dataSourceTransactionManager.setDataSource(dataSource);
    return dataSourceTransactionManager;
  }
}