Talk is cheap , show me your code!
欢迎来到付振南Java博客,让我们一起学习Java吧!

spring之声明式事务控制(纯注解)

之前讲解了如何利用xml注解的方式实现spring的声明式事务控制,今天来讲一下利用纯注解的方式实现。

之前注解方式配置的ApplicationContext.xml文件

在之前的注解方式中,我们发现还是有这么多的xml配置文件,那么可不可以不配置这些,只利用纯注解就可以实现呢?答案是肯定的。

首先我们新创建一个config包,然后新建一个SpringConfig配置类,该类等同于xml中的ApplicationContext.xml文件,然后加入要扫描的包,同时去掉xml文件中要扫描的包。

package cn.fuzhennan.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
* spring的配置类,和ApplicationContext.xml差不多
* @author fuzhennan
*/
@Configuration
@ComponentScan("cn.fuzhennan")
public class SpringConfiguration {
}

然后我们看到xml配置文件中还有对jdbcTemplate和数据源的配置,要去掉这些的话,我们得在config包中新建一个JdbcConfig配置类,在xml配置中我们也知道jdbcTemplate是通过构造函数创建的对象,所以我们在jdbcConfig类中写一个创建jdbcTemplate对象的方法,并且放入bean容器中。

/**
 * 创建jdbcTemplate对象
 * @param dataSource
 * @return
 */
@Bean(name = "jdbcTemplate")
public JdbcTemplate createJdbcTemplate(DataSource dataSource){
return new JdbcTemplate(dataSource);
}

然后是想办法删除xml中的数据源配置,我们现在资源文件夹resources中新建一个jdbcConfig.properties的文件来保存连接数据库的相关信息。

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useSSL=FALSE
jdbc.username=root
jdbc.password=root

然后回到jdbcConfig配置类中定义这些变量并且加上注解注入。

@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;

最后跟创建jdbcTemplate方法一样写一个创建DataSource的方法来创建数据源,并且放入bean中。

/**
* 创建数据源
* @return
*/
@Bean(name = "dataSource")
public DataSource createDataSource(){
DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName(driver);
driverManagerDataSource.setUrl(url);
driverManagerDataSource.setUsername(username);
driverManagerDataSource.setPassword(password);
return driverManagerDataSource;
}

jdbcConfig类的完整代码:

package cn.fuzhennan.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;

/**
* 和数据库相关的配置类
*/
public class JdbcConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
/**
* 创建jdbcTemplate对象
* @param dataSource
* @return
*/
@Bean(name = "jdbcTemplate")
public JdbcTemplate createJdbcTemplate(DataSource dataSource){
return new JdbcTemplate(dataSource);
}

/**
* 创建数据源
* @return
*/
@Bean(name = "dataSource")
public DataSource createDataSource(){
DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName(driver);
driverManagerDataSource.setUrl(url);
driverManagerDataSource.setUsername(username);
driverManagerDataSource.setPassword(password);
return driverManagerDataSource;
}
}

到这一步,我们可以把xml配置文件中的jdbcTemplate和数据源的配置全删了,此时就剩一个事务管理器的配置了。

同样的,要想把它彻底干掉,我们需要在config包中新建一个事务配置类TransactionConfig,然后在该类中写一个创建transaction的方法并且放入到bean中。

package cn.fuzhennan.config;

import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

/**
* 和事务相关的配置
*/
public class TransactionConfig {
/**
* 创建Transaction并且注入数据源
* @param dataSource
* @return
*/
@Bean(name = "transactionManager")
public PlatformTransactionManager createTransaction(DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
}

到此为止,xml配置文件可以彻底删除了,但是由于我们新增了两个配置类,和一个资源文件,所以我们需要到SpringConfiguration文件中导入声明。

@Import({JdbcConfig.class,TransactionConfig.class})
@PropertySource("jdbcConfig.properties")

最后也是最重要的一步,开启事务控制的注解!

@EnableTransactionManagement

SpringConfiguration类的完整代码:

package cn.fuzhennan.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
* spring的配置类,和ApplicationContext.xml差不多
* @author fuzhennan
*/
@Configuration
@ComponentScan("cn.fuzhennan")
@Import({JdbcConfig.class,TransactionConfig.class})
@PropertySource("jdbcConfig.properties")
@EnableTransactionManagement
public class SpringConfiguration {
}

最后我们编写测试类来测试一下,同样的我们需要在更新完aaa账户之后写一个错误代码,然后测试一下。

程序出现异常,除数不能为0
测试后的数据库文件

我们可以看到,程序出现错误,钱没有转成功,这就是我们要的结果,说明纯注解配置没有任何问题,我们再把错误代码注释掉,看看能不能转账成功。

程序运行正常
测试完后的数据库文件

我们可以看到,钱已经转成功了,到此为止,纯注解的方式实现spring的声明式事务控制算是成功了。

赞(3) 打赏
未经允许不得转载:付振南Java博客 » spring之声明式事务控制(纯注解)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏