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
能夠看到這個bean已是由AOP幫我處理以後的bean了,那這個bean是何時生成的以及怎麼就變成了咱們如今看到的樣子的呢?依稀記得有一個 DefaultListableBeanFactory的類,它負責bean的建立,在這個類下搜了一下 doCreateBean,找到了它的父類 AbstractAutowireCapableBeanFactory,打上斷點,看會不會停下來。果真命中了斷點,可是看到的beanName多是這樣的,不過不要緊,咱們直接繼續,直到找到咱們的bean爲止。經過斷點,最終咱們定位到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。