使用纯java配置类配置spring事务管理
本文用的是经典的银行转账的例子…
SpringConfig.java 配置类
package com.cangwu.config;
import org.springframework.context.annotation.*;
@Configuration
@ComponentScan("com.cangwu")
@PropertySource("classpath:jdbc.properties")
@Import({TransactionConfig.class,JdbcConfig.class})
public class SpringConfig {}
jdbc.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///test?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123
JdbcConfig.java 配置类 —连接池的配置
package com.cangwu.config;
import ...
public class JdbcConfig {
@Value("${jdbc.driverClass}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean(name = "dataSource")
public BasicDataSource dataSource() {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
return ds;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
TransactionConfig.java 事务配置类
package com.cangwu.config;
import ...
@Aspect
@EnableTransactionManagement //等同于xml配置中的 <tx:annotation-driven />
public class TransactionConfig {
/**
* 配置事务管理器 注入连接池
*/
@Bean(name = "transactionManager")
public DataSourceTransactionManager transactionManager(
DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
AccountService.java
package com.cangwu.service;
public interface AccountService {
/**
* 转账功能
* @param out 转出账户
* @param in 转入账户
* @param money 转出金额
*/
void transfer(String out,String in,Double money);
}
AccountServiceImpl.java
package com.cangwu.service.impl;
import ...
@Service("accountService")
@Transactional(isolation = Isolation.REPEATABLE_READ,
propagation = Propagation.REQUIRED,
rollbackFor = Exception.class,readOnly = false)
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Override
public void transfer(String out, String in, Double money) {
accountDao.outMoney(out,money);
//int d = 1 / 0; 产生异常
accountDao.inMoney(in,money);
}
}
AccountDao.java
package com.cangwu.dao;
public interface AccountDao {
/**
* 转出账户
* @param out 转出账户名
* @param money 转账金额
*/
void outMoney(String out,Double money);
/**
* 转入账户
* @param in 转入账户名
* @param money 转账金额
*/
void inMoney(String in,Double money);
}
AccountDaoImpl.java
package com.cangwu.dao.impl;
import ...
@Repository("accountDao")
public class AccountDaoImpl implements AccountDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public void outMoney(String out, Double money) {
String OUT_MONEY = "update account set money = money - ? where name = ?";
jdbcTemplate.update(OUT_MONEY,money,out);
}
@Override
public void inMoney(String in, Double money) {
String IN_MONEY = "update account set money = money + ? where name = ?";
jdbcTemplate.update(IN_MONEY,money,in);
}
}