06-spring源码解析之声明式事务

2020-01-26  本文已影响0人  刘小刀tina

声明式事务:
环境搭建:

  1. 导入相关依赖:数据源,数据驱动, 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();

    }

}//类的大括号

上一篇下一篇

猜你喜欢

热点阅读