Spring Boot Transactional注解源码阅读笔记(一)

  Spring提供了很是强大的Transactional注解,下面这篇文章想从源码的角度来看一下Transactional这个注解是如何工做的。html

1.Spring AOP

  Transactional注解的实现依赖于AOP技术,AOP是面向切面编程(Aspect-oriented programming)的缩写,是一种不一样于面向对象编程(Object-oriented programming)的技术。它的好处有不少,其中的一个好处就是:在不改变现有代码的基础上,增长新的行为。网上关于AOP的文章仍是比较多的,能够自行搜索阅读。java

2.代码demo

  为了可以弄清楚Transactional注解是如何工做的,须要一个简单的例子来追踪代码执行的过程。能够参考官方的例子。Spring Boot如今很是的智能,你几乎不须要怎么配置就能使用Transactional这个注解,引述官方文档里面的一段话:spring

Your application has actually zero configuration. Spring Boot will detect spring-jdbc on the classpath and h2 and will create a DataSource and a JdbcTemplate for you automatically. Because such infrastructure is now available and you have no dedicated configuration, a DataSourceTransactionManager will also be created for you: this is the component that intercepts the @Transactional annotated method编程

  至于如何作到如此少的配置的,能够参考一些关于Spring Boot Stater的文章。app

3.初探:Transactional 注解到底作了什么

  想要探究这个注解如何工做,刚开始都是无从下手的。那就用最笨的办法,声明一个bean,在这个bean的某一个方法上面加上 @Transactional 注解,而后调用这个方法,看看发生了什么。ide

Object o = context.getBean("ttb");
if (o instanceof TransactionTestBean) {
      TransactionTestBean tmp = (TransactionTestBean) o;
      String s = tmp.transactionTest();
      System.out.println(s);
}
复制代码

  经过debug,发现这个叫ttb(不要在乎名字)的bean变成了下面这个样子: post

a1.jpg
能够看到这个bean已是由AOP帮我处理以后的bean了,那这个bean是何时生成的以及怎么就变成了咱们如今看到的样子的呢?依稀记得有一个 DefaultListableBeanFactory的类,它负责bean的建立,在这个类下搜了一下 doCreateBean,找到了它的父类 AbstractAutowireCapableBeanFactory,打上断点,看会不会停下来。果真命中了断点,可是看到的beanName多是这样的,不过不要紧,咱们直接继续,直到找到咱们的bean为止。
b1.jpg

4.跟踪

  经过断点,最终咱们定位到cglib的处理是在方法applyBeanPostProcessorsAfterInitialization里面完成的,这个方法的代码大概是长这个样子的。ui

public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException {
	Object result = existingBean;
	for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
			result = beanProcessor.postProcessAfterInitialization(result, beanName);
			if (result == null) {
				return result;
			}
		}
	return result;
}
复制代码

  能够看到这个getBeanPostProcessors里面有不少的BeanPostProcessor,其中有一个叫作InfrastructureAdvisorAutoProxyCreator的,在它执行完postProcessAfterInitialization以后,咱们的bean就变成了cglib的形式了,经过进一步的跟踪,发如今AbstractAutoProxyCreator类下,有一个createProxy的方法,顺着调用的关系最后找到了在org.springframework.aop.framework包下有一个CglibAopProxy的类,类里面的getProxy方法,终于找到了和这篇文章内容有点类似的代码了,建立bean的过程初步跟踪完成。this

5.小结

  这篇文章只是初略的记录了spring如何建立带有 @Transactional注解的bean的,不少细节的跳过了(好比刚才那个InfrastructureAdvisorAutoProxyCreator是如何来的),后续的文章会呈现这些细节以及Transactional生成的proxy在调用业务代码以前作了什么。spa


打个广告,阿里巴巴集团长期接受简历,有须要内推的朋友能够将简历发送到 linlan.zcj@alibaba-inc.com。

相关文章
相关标签/搜索