String sql = “update book_stock set stock=stock-1 where id=?”;
jdbcTemplate.update(sql,id);
// for (int i = 1 ;i>=0 ;i--)
// System.out.println(10/i);
}
}
5.Main 的代码
AnnotationConfigApplicationContext configApplicationContext = new
AnnotationConfigApplicationContext(TransactionConfig.class);
BookService bean = configApplicationContext.getBean(BookService.class);
bean.checkout(1);
System.out.println(“完成”);
三、Spring 事务的源码分析
Spring 事务和 SpringAOP 一样,都是利用了 SpringIoc 容器的插件功能。在 SpringIOC 容
器 的 生 命 周 期 过 程 中 整 合 了 Spring 事 务 的 功 能 。 大 概 过 程 : 通 过 @Import 注 册
TransactionManagementConfigurationSelector 类 。 该 类 中 实 现 了 ImportSelector 接 口 的
selectImports 方 法 。 在 创 建 AnnoteationConfigApplicationContext 的 构 造 函 数 中 会 调 用
refresh() 方 法 。 在 invokeBeanFactoryPostProcessors() 中 会 调 用
TransactionManagementConfigurationSelector 类 的 selectImports 方 法 , 会 生 成
AutoProxyRegistrar 的 对 象 和 ProxyTransactionManagementConfiguration 对 象 。
AutoProxyRegistrar 会 调 用 该 类 的 registerBeanDefinitions 方 法 注 册 类 型 为
InfrastructureAdvisorAutoProxyCreator 的 RootBeanDefinition 。
ProxyTransactionManagementConfiguration 中 注 入 了
BeanFactoryTransactionAttributeSourceAdvisor 类型的 Bean,即事务通知类,该类继承了
Advisor 。 在 finishBeanFactoryInitialization() 过 程 中 第 一 次 调 用
getAdvicesAndAdvisorsForBean 的 时 候 , 会 先 进 行 Advisors 的 创 建 , 再 获 取 候 选 的
Advisors 。 在 创 建 完 Bean 后 会 调 用 InfrastructureAdvisorAutoProxyCreator 的
postProcessAfterInitialization 方法,从 Advisors 中查找是否匹配当前正在创建的 Bean,如
果能匹配,则创建相关的事务动态代理对象。
完整源码分析分三部分:Spring 事务的初始化、事务的创建、事务的调用过程。
一、Spring 事务的初始化
主要逻辑是找到所有标注了 @EnableTransactionManagement 的类,并且解析标注中的事
务通知方法和 BeanPostProcessor 的实现类 BeanFactoryTransactionAttributeSourceAdvisor。
整体代码流程图如下:
评论0
最新资源