spring基于注解的声明式事务控制配置

配置文件:

<?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:aop="http://www.springframework.org/schema/aop"       xmlns:context="http://www.springframework.org/schema/context"       xmlns:tx="http://www.springframework.org/schema/tx"       xsi:schemaLocation="        http://www.springframework.org/schema/beans        https://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/tx        https://www.springframework.org/schema/tx/spring-tx.xsd        http://www.springframework.org/schema/aop        https://www.springframework.org/schema/aop/spring-aop.xsd        http://www.springframework.org/schema/context        https://www.springframework.org/schema/context/spring-context.xsd">

    <!--配置spring创建容器时需要扫描的包-->    <context:component-scan base-package="com.itheima"></context:component-scan>

    <!--配置JdbcTemplate-->    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">        <property name="dataSource" ref="dataSource"></property>    </bean>

    <!--配置数据源-->    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>        <property name="url" value="jdbc:mysql://localhost:3306/eesy?serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8&amp;useSSL=false"></property>        <property name="username" value="root"></property>        <property name="password" value="123456"></property>    </bean>

    <!--spring中基于注解的声明式事务控制配置步骤        1.配置事务管理器        2.开启spring对注解事务的支持        3.在需要事务支持的地方使用@Transactional注解-->    <!--配置事务管理-->    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property name="dataSource" ref="dataSource"></property>    </bean>

    <!--开启spring对注解事务的支持-->    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven></beans>

service实现类:
package com.itheima.service.impl;

import com.itheima.Dao.IAccountDao;import com.itheima.domain.Account;import com.itheima.service.IAccountService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/** * @Author: lijiahao * @Description: * @Data: Create in 0:16 2020/2/6 * @Modified By: */@Service("accountService")@Transactional(propagation = Propagation.SUPPORTS,readOnly = true)//只读型事务的配置public class AccountServiceImpl implements IAccountService {

    @Autowired    private IAccountDao accountDao;

    public Account findAccountById(Integer accountid) {            return accountDao.findAccountById(accountid);    }

    //需要的是读写型事务配置    @Transactional(propagation = Propagation.REQUIRED,readOnly = false)    public void transfer(String sourceName, String targetName, Float money) {        System.out.println("trans......");            //2.1.根据名称查询转出帐户            Account source =  accountDao.findAccountByName(sourceName);            //2.2.根据名称查询转入帐户            Account target = accountDao.findAccountByName(targetName);            //2.3.转出账户减钱            source.setMoney(source.getMoney()-money);            //2.4.转入帐户加钱            target.setMoney(target.getMoney()+money);            //2.5.更新转出账户            accountDao.updateAccount(source);

            int i = 1/0;

            //2.6.更新转入账户            accountDao.updateAccount(target);

    }}

dao层实现类:
package com.itheima.Dao.impl;

import com.itheima.Dao.IAccountDao;import com.itheima.domain.Account;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.support.JdbcDaoSupport;import org.springframework.stereotype.Repository;

import java.util.List;

/** * @Author: lijiahao * @Description: * @Data: Create in 2:32 2020/2/9 * @Modified By: */@Repository("accountDao")public class AccountDaoImpl implements IAccountDao {

    @Autowired    private JdbcTemplate jdbcTemplate;

    public Account findAccountById(Integer id) {        List<Account> accountList = jdbcTemplate.query("select * from account where id = ?", new BeanPropertyRowMapper<Account>(Account.class),id);        return accountList.isEmpty()?null:accountList.get(0);    }

    public Account findAccountByName(String name) {        List<Account> accountList = jdbcTemplate.query("select * from account where name = ?", new BeanPropertyRowMapper<Account>(Account.class),name);        if(accountList.isEmpty()){            return null;        }        if(accountList.size()>1){            throw new RuntimeException("结果集不唯一");        }        return accountList.get(0);    }

    public void updateAccount(Account account) {        jdbcTemplate.update("update account set name=? ,money=? where id = ?", account.getName(),account.getMoney(),account.getId());    }}

实体类:
package com.itheima.domain;

import java.io.Serializable;

/** * @Author: lijiahao * @Description: 账户的实体类 * @Data: Create in 1:32 2020/2/9 * @Modified By: */public class Account implements Serializable {

    private Integer id;    private String name;    private Float money;

    @Override    public String toString() {        return "account{" +                "id=" + id +                ", name=‘" + name + ‘\‘‘ +                ", money=" + money +                ‘}‘;    }

    public Integer getId() {        return id;    }

    public void setId(Integer id) {        this.id = id;    }

    public String getName() {        return name;    }

    public void setName(String name) {        this.name = name;    }

    public Float getMoney() {        return money;    }

    public void setMoney(Float money) {        this.money = money;    }}

测试:
package com.itheima.test;

import com.itheima.domain.Account;import com.itheima.service.IAccountService;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

/** * @Author: lijiahao * @Description: 使用junit测试配置 * @Data: Create in 0:59 2020/2/6 * @Modified By: */@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations="classpath:bean.xml")public class AccountServiceTest {    @Autowired    private  IAccountService as;

    @Test    public void testTransfer(){        as.transfer("aaa", "bbb", 100f);    }

}

原文地址:https://www.cnblogs.com/lijiahaoAA/p/12288417.html

时间: 2024-10-12 20:46:13

spring基于注解的声明式事务控制配置的相关文章

spring基于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:aop="http://www.springframework.org/schema/

阶段3 2.Spring_10.Spring中事务控制_7 spring基于注解的声明式事务控制

创建新项目 复制上一个pom.xml的内容.依赖和打包的方式 再复制src的代码过来 bean.xml.多导入context的声明 Service的实现类增加注解 dao的set方法删掉 通过Autowried注入dao dao注解 service改完了改dao.加上Repository 此时不能再继承JdbcDaoSupport.这里的继承删掉. 上面定义jdbcTemplate. 这样直接使用jdbcTemplate来操作 使用Autowired注入jdbcTemplate 删除原来的配置

spring基于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:aop="http://www.springframework

阶段3 2.Spring_10.Spring中事务控制_8 spring基于纯注解的声明式事务控制

新建项目 把之前项目src下的内容全部复制过来 pom.xml内复制过来 开始配置 新建一个config的包,然后再新建配置文件类SpringConfiguration @Configuration这个注解是可写可不写的. 这个类会做为字节码的参数传给ApplicationContext @ComponentScan配置要扫描的包 @Import 但是这个Import要导谁呢? 新建JdbcConfig类 这一就可以通过Import导入JdbcConfig这个类 xml里面扫描包的配置可以省略掉

28Spring_的事务管理_银行转账业务加上事务控制_基于注解进行声明式事务管理

将applicationContext.xml 和 AccountServiceImpl 给备份一个取名为applicationContext2.xml 和 AccountServiceImpl2.java 第一步:配置事务管理器 第二步:配置注解驱动 以上两步是在ApplicationContext2.xml中完成的. 内容如下所示: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&quo

基于XML的声明式事务控制

1.maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM

spring声明式事务以及配置

使用spring提供的事务处理机制的好处是程序员可以不用关心事务的切面了,只要配置就好了,可以少写代码. spring声明式事务处理 spring 声明:针对的是程序员,程序员告诉spring容器,哪些方法需要事务,哪些方法不需要事务 事务处理   spring容器来做事务处理 目的:让spring管理事务,开发者不再关注事务 spring声明式事务处理的步骤: 1.搭建环境 2.把dao层和service层的接口和类写完 3.在spring的配置文件中,先导入dataSource 4.测试 5

Spring声明式事务的配置~~~

/*2011年8月28日 10:03:30 by Rush  */ 环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加方法: 点击项目右键->Build Path->Add librarys: 打开Add Libraries对话框,然后选定 MyEclipse Libraries: 点击Next,找到Spring 2.0 aop Libraries并勾选上,点击finsh即可. 如果在项目里面能看到下面的库文件,

spring学习笔记(22)声明式事务配置,readOnly无效写无异常

在上一节内容中,我们使用了编程式方法来配置事务,这样的优点是我们对每个方法的控制性很强,比如我需要用到什么事务,在什么位置如果出现异常需要回滚等,可以进行非常细粒度的配置.但在实际开发中,我们可能并不需要这样细粒度的配置.另一方面,如果我们的项目很大,service层方法很多,单独为每个方法配置事务也是一件很繁琐的事情.而且也可能会造成大量重复代码的冗杂堆积.面对这些缺点,我们首要想到的就是我们spring中的AOP了.spring声明式事务的实现恰建立在AOP之上. 在这一篇文章中,我们介绍s