(一)AOP:【1】事务案例
一、声明式事务环境搭建
1、导入依赖
导入相关依赖:数据源、数据库驱动、spring-jdbc 模块
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jdbcartifactId>
<version>${spring-version}version>
dependency>
<dependency>
<groupId>c3p0groupId>
<artifactId>c3p0artifactId>
<version>0.9.1.2version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.44version>
dependency>
2、配置数据源、JdbcTemplate(Spring提供的简化数据库操作工具)操作数据
3、在方法上标注 @Transaction 表示当前方法是一个事务方法;
4、在配置类上使用 @EnableTransactionManagement 开始基于注解的事务管理功能;
5、配置事务管理器来控制事务:
//注册事务管理器在容器中
@Bean
public PlatformTransactionManager transactionManager() throws Exception{
return new DataSourceTransactionManager(dataSource());
}
二、案例
1、声明一个 dao 组件
@Repository
public class UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void insert(){
String sql = "INSERT INTO `user` (name, password) VALUES(?,?)";
String password = UUID.randomUUID().toString().substring(0, 5);
jdbcTemplate.update(sql, "张三", password);
}
}
2、声明一个 service 组件,并加上事务方法
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Transactional
public void insertUser(){
userDao.insert();
//otherDao.other();xxx
System.out.println("插入完成...");
int i = 10/0;
}
}
3、创建配置类,并加入相关组件
@EnableTransactionManagement
@ComponentScan("com.njf.bean")
@Configuration
public class TxConfig {
//数据源
@Bean
public DataSource dataSource() throws Exception {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser("root");
dataSource.setPassword("root");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
return dataSource;
}
//配置 JdbcTemplate
@Bean
public JdbcTemplate jdbcTemplate() throws Exception{
//Spring对@Configuration类会特殊处理;给容器中加组件的方法,多次调用都只是从容器中找组件
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource());
return jdbcTemplate;
}
//注册事务管理器在容器中
@Bean
public PlatformTransactionManager transactionManager() throws Exception{
return new DataSourceTransactionManager(dataSource());
}
}
4、测试
@Test
public void test1() {
AnnotationConfigApplicationContext ioc = new AnnotationConfigApplicationContext(TxConfig.class);
System.out.println("IOC容器创建完毕");
UserService userService = ioc.getBean(UserService.class);
userService.insertUser();
}