Spring 事务源码分析-上

本文深入分析Spring事务源码,从环境准备开始,通过配置类和源码解析,理解Spring事务的入口点,如TransactionManagementConfigurationSelector、AutoProxyRegistrar等。文章详细阐述了事务源码在IOC阶段的流程,包括组件的注册和处理,特别讨论了InfrastructureAdvisorAutoProxyCreator类的角色和作用。最后,文章以简单的数据库操作为背景,展示了Spring事务在实际应用中的基础用法。
摘要由CSDN通过智能技术生成

前言

本章节对Spring 事务源码详细解析,Spring 事务是基于Spring AOP实现,但是也离不开Spring IOC,对于Spring事务源码的学习,首先立一个明确的目标,那就是从整个Spring 源码进行解读分析。在之前文章中,我们已经有了Spring IOC源码的学习,又学了Spring AOP的源码学习,在整个过程中,我们对核心的扩展接口又有了源码深入的学习,还对Spring 事务源码IOC阶段的源码进行了深入的学习,接下来我们要把Spring事务作为第一个学完Spring源码之后的Spring源码实战应用组件去学习。

环境准备

同样准备Spring事务源码测试demo环境,业务场景非常demo,一张表table_a,三个字段,初始化数据,numm初始值为100,两个更新方法,其中一个修改为10,另一个方法加10,正常执行,最后结果为20。(场景也很简单,代码也简单,也很lower,命名也很lower,希望广大网友不要模仿,不过这么做,基本没有场景,写起来也方便,基本不用脑,费脑的事还是交给Spring源码吧。高大尚的方式应学Spring命名规范。这块为了统一测试规范,数据库中numm的值,每次测试完成之后,会手动恢复至100,下文中不在赘述)
配置类

@Configuration
@ComponentScan("com.xxsc.cn.txstudy")
@EnableTransactionManagement
@EnableAspectJAutoProxy
public class MyConfig {
   
    @Bean
    public DataSource dataSource() {
   
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUsername("*****");
        dataSource.setPassword("*****");
        dataSource.setUrl("jdbc:mysql://localhost:3306/tx-study");
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        return dataSource;
    }
    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
   
        return new JdbcTemplate(dataSource);
    }
    //事务管理器
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
   
        return new DataSourceTransactionManager(dataSource);
    }
}

接口

public interface FunctionService {
   

    void update(int numm,String pkId);

    void add(int numm,String pkId);
}

实现类

@Service
public class FunctionServiceImpl implements FunctionService {
   
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Override
    @Transactional
    public void update(int numm, String pkId) {
   
        String sql = "update table_a set numm=? where pk_id=?";
        jdbcTemplate.update(sql,numm,pkId);
        //调用另一个方法
        add(numm+10,pkId);
    }

    @Override
    public void add(int numm, String pkId) {
   
        String sql = "update table_a set numm=? where pk_id=?";
        jdbcTemplate.update(sql,numm,pkId);
    }
}

测试main方法

public class AppTest {
   

    public static void main(String[] args) {
   
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
        FunctionService functionService = context.getBean(FunctionService.class);
        //第二个参数为sql条件
        functionService.update(10,"asdfasdfasdfasdf");
    }
}

数据库表table_a
在这里插入图片描述
先执行以下,看看数据库的变化
数据修改为20
在这里插入图片描述
对于以上操作及代码,交互数据使用Spring 的JdbcTemplate,这个也是比较基础,不过多解释,直接开启源码分析。

Spring事务源码解析

Spring事务源码分析入口

配置类@EnableTransactionManagement

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值