1. 配置步骤: 135
● 第一步:配置事务管理器
● 第二步:配置通知
● 第三步:配置切面
记得添加aspectj的依赖:
org.springframework
spring-aspects
6.0.0-M2
Spring配置文件如下:
记得添加aop的命名空间。
pom.xml
4.0.0
com.powernode
course31
1.0-SNAPSHOT
jar
repository.spring.milestone
Spring Milestone Repository
https://repo.spring.io/milestone
org.springframework
spring-context
6.0.0-M2
org.springframework
spring-aspects
6.0.0-M2
org.springframework
spring-jdbc
6.0.0-M2
mysql
mysql-connector-java
8.0.30
com.alibaba
druid
1.2.13
jakarta.annotation
jakarta.annotation-api
2.1.1
junit
junit
4.13.2
test
17
17
spring.xml
pojo类Account
package com.powernode.bank.pojo;
/**
* 银行账户类 119
**/
public class Account {
private String actno;
private Double balance;
@Override
public String toString() {
return "Account{" +
"actno='" + actno + ''' +
", balance=" + balance +
'}';
}
public Account() {
}
public Account(String actno, Double balance) {
this.actno = actno;
this.balance = balance;
}
public String getActno() {
return actno;
}
public void setActno(String actno) {
this.actno = actno;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
}
dao接口AccountDao
package com.powernode.bank.dao;
import com.powernode.bank.pojo.Account;
/**
* 专门负责账户信息的CRUD操作。 119
* DAO中只执行SQL语句,没有任何业务逻辑。
* 也就是说DAO不和业务挂钩。
*/
public interface AccountDao {
/**
* 根据账号查询账户信息
* @param actno
* @return
*/
Account selectByActno(String actno);
/**
* 更新账户信息。
* @param act
* @return
*/
int update(Account act);
}
dao接口实现类AccountDaoImpl
package com.powernode.bank.dao.impl;
import com.powernode.bank.dao.AccountDao;
import com.powernode.bank.pojo.Account;
import jakarta.annotation.Resource;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
/**
* AccountDao接口实现类 119
**/
@Repository("accountDao")
public class AccountDaoImpl implements AccountDao {
@Resource(name = "jdbcTemplate")
private JdbcTemplate jdbcTemplate;
@Override
public Account selectByActno(String actno) {
String sql = "select actno, balance from t_act where actno = ?";
Account account = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper(Account.class), actno);
return account;
}
@Override
public int update(Account act) {
String sql = "update t_act set balance = ? where actno = ?";
int count = jdbcTemplate.update(sql, act.getBalance(), act.getActno());
return count;
}
}
业务层接口AccountService
package com.powernode.bank.service;
import com.powernode.bank.pojo.Account;
/**
* 业务接口 119
**/
public interface AccountService {
/**
* 转账业务方法
* @param fromActno 从这个账户转出
* @param toActno 转入这个账户
* @param money 转账金额
*/
void transfer(String fromActno, String toActno, double money);
}
业务层接口实现类AccountServiceImpl
package com.powernode.bank.service.impl;
import com.powernode.bank.dao.AccountDao;
import com.powernode.bank.pojo.Account;
import com.powernode.bank.service.AccountService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
* 业务层实现类 119
**/
@Service("accountService")
public class AccountServiceImpl implements AccountService {
@Resource(name = "accountDao")
private AccountDao accountDao;
// 控制事务,因为在这个方法中要完成所有的转账业务。
@Override
public void transfer(String fromActno, String toActno, double money) {
// 第一步:开启事务
// 第二步:执行核心业务逻辑
// 查询转出账户的余额是否充足
Account fromAct = accountDao.selectByActno(fromActno);
if (fromAct.getBalance()
测试
package com.powernode.bank.test;
import com.powernode.bank.service.AccountService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 声明式事务之XML实现方式
* 测试 135
**/
public class BankTxTest {
@Test
public void testNoAnnotation(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
AccountService accountService = applicationContext.getBean("accountService", AccountService.class);
try {
accountService.transfer("act-001", "act-002", 10000.0);
System.out.println("转账成功");
} catch (Exception e) {
e.printStackTrace();
}
}
}
在AccountServiceImpl的transfer方法模拟异常
// 模拟异常
String s = null;
s.toString();
钱没有消失,事务生效
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: vue3使用vite-plugin-ssr实现ssr
最近想用vue做个简单的网站,体验下建站的全流程,写篇文章记录下vue开发过程。 之前的vue开发默认都是用了单页面应用,这次做的时候想到了SEO,决定尝试下SSG模式部署。 为什么用SSR/SSG 个人网站想要有自然流量,肯定要依赖百度、bing等搜索引擎网…