Spring提供了很是强大的Transactional注解,下面这篇文章想从源码的角度来看一下Transactional这个注解是如何工做的。html
Transactional注解的实现依赖于AOP技术,AOP是面向切面编程(Aspect-oriented programming)的缩写,是一种不一样于面向对象编程(Object-oriented programming)的技术。它的好处有不少,其中的一个好处就是:在不改变现有代码的基础上,增长新的行为。网上关于AOP的文章仍是比较多的,能够自行搜索阅读。java
为了可以弄清楚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
想要探究这个注解如何工做,刚开始都是无从下手的。那就用最笨的办法,声明一个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
经过断点,最终咱们定位到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
这篇文章只是初略的记录了spring如何建立带有 @Transactional注解的bean的,不少细节的跳过了(好比刚才那个InfrastructureAdvisorAutoProxyCreator是如何来的),后续的文章会呈现这些细节以及Transactional生成的proxy在调用业务代码以前作了什么。spa
打个广告,阿里巴巴集团长期接受简历,有须要内推的朋友能够将简历发送到 linlan.zcj@alibaba-inc.com。