关于spring boot 事物注解管理相关过程

package com.zdc.sp.tx.config;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration;
import org.springframework.transaction.annotation.TransactionManagementConfigurationSelector;

import com.mchange.v2.c3p0.ComboPooledDataSource;


/**
 * 配置事务管理器来控制事务
 *         @Bean
        public PlatformTransactionManager transactionManager()
 *         
 * 原理:
 *         1)、@EnableTransactionManagement
 *                 利用TransactionManagementConfigurationSelector给容器中导入相应的组件
 *                 导入两个组件:
 *                 AutoProxyRegistrar
 *              ProxyTransactionManagementConfiguration
 *      2)、AutoProxyRegistrar:
 *              给容器中注册一个InfrastructureAdvisorAutoProxyCreator组件(利用后置处理器机制在对象创建以后,
 *              包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用)
 *      
 *      3)、ProxyTransactionManagementConfiguration 做了什么?
 *           1、给容器中注册事务增强器:
 *                   1)、事务增强器要用事务注解的信息:AnnotionTransactionAttributeSource 解析事务注解
 *                  2)、事务拦截器:
 *                          TransactionInterceptor;保存了事务属性信息,事务管理器;
 *                          他是一个MethodInterceptor
 *                          在目标方法执行的时候:
 *                               执行拦截器链
 *                               事务拦截器:
 *                                   1)、先获取事务相关属性
 *                                   2)、在获取PlatformTransactionManager,如果事先没有添加指定任何transactionManager;
 *                                       最终会重容器中按照类型获取一个 PlatformTransactionManager
 *                                   3)、执行目标方法:
 *                                        如果异常,获取到事务管理器,利用事务管理回滚操作;
 *                                        如果正常,利用事务管理器,提交事务;
 *              
 *
 */
@EnableTransactionManagement
@Configuration
public class Txonfig {

    @Bean
    public DataSource dataSourcetest() throws Exception{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser("root");
        dataSource.setPassword("123456");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate() throws Exception{
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSourcetest());
        return jdbcTemplate;
    }
    
    @Bean
    public PlatformTransactionManager transactionManager() throws Exception{
        PlatformTransactionManager transactionManager = new DataSourceTransactionManager(dataSourcetest());
        return transactionManager;
    }
}
 

猜你喜欢

转载自blog.csdn.net/u014450465/article/details/90182345