06-spring源码解析之声明式事务
2020-01-26 本文已影响0人
刘小刀tina
声明式事务:
环境搭建:
- 导入相关依赖:数据源,数据驱动, Spring-jdbc模块
2.配置数据源,JdbcTemplate(Spring提供的简化数据数据库操作的工具)操作数据
3.给方法上标注@Transactional表示当前方法是一个事物方法
4.@EnableTransactionnal 表示当前方法是一个事务方法
5.配置事务管理器 来控制事务
@Data
public class User {
private String id;
private String name;
private String age;
}
========================================================
@Repository
public class UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void insert(){
String sql="insert into user (id,name,age) values(?,?,?)";
String id = UUID.randomUUID().toString().substring(0, 5);
jdbcTemplate.update(sql,id,"tina",20000);
}
}
========================================================
@Service
@EnableTransactionManagement //开启基于注解的事务管理功能
public class UserService {
@Autowired
private UserDao userDao;
@Transactional
public void insert(){
userDao.insert();
System.out.println("新增数据成功!");
int i = 3/0;
}
}//类的大括号
========================================================
@Configuration//表明是一个配置类
@ComponentScan(value = "com.tina.spring0123.tx")//指定扫描的包
@PropertySource(value = {"classpath:user.properties"})
public class TxConfig {
@Value("${user.user}")
private String user;
@Value("${user.password}")
private String password;
@Value("${user.url}")
private String url;
@Value("${user.driverClass}")
private String driverClass;
@Bean //将数据源作为组件注册到容器中
public DataSource dataSource() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(password);
dataSource.setJdbcUrl(url);
dataSource.setDriverClass(driverClass);
return dataSource;
}
@Bean//配置JdbcTemplate并注册到容器中
public JdbcTemplate jdbcTemplate() throws PropertyVetoException {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource());
return jdbcTemplate;
}
@Bean //配置事务管理器管理事务, 并将事务管理器注册到容器中
public PlatformTransactionManager TransactionManager() throws PropertyVetoException {
return new DataSourceTransactionManager(dataSource());
}
}//类的大括号
========================================================
@SpringBootTest
public class IocTestTx {
@Test
public void TEST(){
//读取配置类生成容器
ApplicationContext ioc = new AnnotationConfigApplicationContext(TxConfig.class);
//获取容器中的所有组件
String[] names = ioc.getBeanDefinitionNames();
for (String name:names) {
System.out.println(name);
}
}
@Test
public void TEST2(){
//读取配置类生成容器
ApplicationContext ioc = new AnnotationConfigApplicationContext(TxConfig.class);
//根据类获取容器中对应的组件
UserService userService = ioc.getBean(UserService.class);
userService.insert();
}
}//类的大括号