36、声明式事务-环境搭建

37、声明式事务-测试成功

38、[源码]-声明式事务-源码分析

/**
* 声明式事务:
*
* 环境搭建:
* 1、导入相关依赖
* 数据源、数据库驱动、Spring-jdbc模块
* 2、配置数据源、JdbcTemplate(Spring提供的简化数据库操作的工具)操作数据
* 3、给方法上标注 @Transactional 表示当前方法是一个事务方法;
* 4、 @EnableTransactionManagement 开启基于注解的事务管理功能;
* @EnableXXX
* 5、配置事务管理器来控制事务;
* @Bean
* public PlatformTransactionManager transactionManager()
*
*
* 原理:
* 1)、@EnableTransactionManagement
* 利用TransactionManagementConfigurationSelector给容器中会导入组件
* 导入两个组件
* AutoProxyRegistrar
* ProxyTransactionManagementConfiguration
* 2)、AutoProxyRegistrar:
* 给容器中注册一个 InfrastructureAdvisorAutoProxyCreator 组件;
* InfrastructureAdvisorAutoProxyCreator:?
* 利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用;
*
* 3)、ProxyTransactionManagementConfiguration 做了什么?
* 1、给容器中注册事务增强器;
* 1)、事务增强器要用事务注解的信息,AnnotationTransactionAttributeSource解析事务注解
* 2)、事务拦截器:
* TransactionInterceptor;保存了事务属性信息,事务管理器;
* 他是一个 MethodInterceptor;
* 在目标方法执行的时候;
* 执行拦截器链;
* 事务拦截器:
* 1)、先获取事务相关的属性
* 2)、再获取PlatformTransactionManager,如果事先没有添加指定任何transactionmanger
* 最终会从容器中按照类型获取一个PlatformTransactionManager;
* 3)、执行目标方法
* 如果异常,获取到事务管理器,利用事务管理回滚操作;
* 如果正常,利用事务管理器,提交事务
*
*/
@EnableTransactionManagement
@ComponentScan("com.it.tx")
@Configuration
public class TxConfig { //数据源
@Bean
public DataSource dataSource() throws Exception{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser("root");
dataSource.setPassword("123456");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/db_mysql");
return dataSource;
} //
@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());
} }

  深入了解源码---@EnableTransactionManagement---引入类TransactionManagementConfigurationSelector

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TransactionManagementConfigurationSelector.class)// 关注点
public @interface EnableTransactionManagement {
boolean proxyTargetClass() default false;
AdviceMode mode() default AdviceMode.PROXY;
int order() default Ordered.LOWEST_PRECEDENCE;
}

深入了解源码---TransactionManagementConfigurationSelector---导入组件"AutoProxyRegistrar"和"ProxyTransactionManagementConfiguration"

public class TransactionManagementConfigurationSelector extends AdviceModeImportSelector<EnableTransactionManagement> {
@Override
protected String[] selectImports(AdviceMode adviceMode) {
switch (adviceMode) {
case PROXY:
// 关注点:根据前面AdviceMode.PROXY,这边注册“AutoProxyRegistrar” 和 “ProxyTransactionManagementConfiguration”
return new String[] {AutoProxyRegistrar.class.getName(), ProxyTransactionManagementConfiguration.class.getName()};
case ASPECTJ:
return new String[] {TransactionManagementConfigUtils.TRANSACTION_ASPECT_CONFIGURATION_CLASS_NAME};
default:
return null;
}
}
}

流程图:

最新文章

  1. ScrollView控件实现屏幕滚动
  2. Android 横屏切换竖屏Activity的生命周期(转)
  3. java中产生对象的两种方式
  4. MVC学习系列——Model验证扩展
  5. 【C#学习笔记】获得系统时间
  6. 强大的grep,sed和awk--用案例来讲解
  7. flying-saucer + iText + Freemarker实现pdf的导出, 支持中文、css以及图片
  8. Java面向对象抽象类案例分析
  9. python正则表达式--分组、后向引用、前(后)向断言
  10. Injection
  11. HDU-1078.FatMouseandCheese(线性dp + dfs)
  12. 《机器学习实战(基于scikit-learn和TensorFlow)》第二章内容的学习心得
  13. Angular 手动解析表达式
  14. C# 多线程七之Parallel
  15. C#小票打印机
  16. HDU 6249 Alice’s Stamps
  17. 基于zookeeper的主备切换方法
  18. map函数和reduce函数、filter函数的区别
  19. 单独配置secondarynamenode
  20. wepy - 与原生有什么不同(watcher监听器.)

热门文章

  1. JAVA SE11环境变量配置(Windows)
  2. GreenPlum 大数据平台--segment 失效问题恢复《二》(全部segment宕机情况下)
  3. 推荐一款移动端小视频App玲珑视频
  4. Supervisor-守护进程工具
  5. SpringBoot第十九篇:邮件服务
  6. Security实现登录安全控制
  7. Centos7.5 安装Mysql5.7
  8. 参加AWS技术峰会的收获与思考
  9. 『You Are Given a Tree 整体分治 树形dp』
  10. TCP的三次握手过程?为什么会采用三次握手,若采用二次握手可以吗