1. 程式人生 > >從JVM的角度看Spring的AOP

從JVM的角度看Spring的AOP

    以下觀點,是個人對AOP底層實現的理解。由於個人知識的侷限性,難免有錯誤,僅
供參考。

    我們以Spring的事務管理機制為切入點,來進行說明。並且,以下所有觀點,都是建
立在2個前提條件下:
1,Spring是在程式執行期間,把事務控制程式碼新增到委託類的位元組碼檔案中的。
2,Spring具有修改位元組碼檔案的能力。

    首先,我們來回顧一下Spring的事務控制。Spring為我們提供了程式設計式的事務控制和
申明式的事務控制。而申明式事務控制的實現依賴的就是我們今天要討論的AOP。程式設計式
事務,就是直接把事務控制程式碼寫在java類中,事務的開啟和提交,都要顯示的寫在java
程式碼中。申明式事務是通過配置的方式,申明哪些DAO層的方法會進行事務控制。Spring
會根據我們的配置檔案,攔截所有我們配置的方法,然後進行事務控制。看下面的程式碼,
這就是我們常見的申明式事務配置檔案的關鍵程式碼:
<bean id="transactionInterceptor"
    class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager" ref="transactionManager" />
    <property name="transactionAttributes">
        <props>
            <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
            <prop key="save*">PROPAGATION_REQUIRED,readOnly</prop>
            <prop key="delete*">PROPAGATION_REQUIRED,readOnly</prop>
            <prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>
            <prop key="update*">PROPAGATION_REQUIRED,readOnly</prop>
            <prop key="*">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean>
    這段程式碼,我們在大部分使用了Spring框架的實際專案中,都可以看到。雖然不是
完全一致,基本上都是大同小異。畢竟,使用的都是Spring的宣告式事務。

    那麼,在程式執行期間,AOP是如何進行事務控制的呢?當用戶點選了一個按鈕,進
行查詢操作時,在後臺,Spring的攔截器就會進行攔截。攔截到這個方法queryAll()以
後,Spring會根據這個方法配置的事務傳播機制(比如是PROPAGATION_REQUIRED,
readOnly),去生成對應的事務控制位元組碼。然後,把生成的位元組碼新增到queryAll()
所對應的位元組碼檔案中。最後,把修改以後的位元組碼檔案裝載到JVM執行。這裡有一個
關鍵點就是,queryAll()方法(或者說queryAll()所在的類)是在專案編譯階段生成
的。

    這就是Spring中的動態代理的實現方式。這裡的“動態”,指的就是在程式執行期
間,生成位元組碼檔案。關於Spring中動態代理的實現細節,業界的看法是一致的:融合

了JDK的動態代理和CGLIB的動態代理。

相關推薦

jvm角度java多執行緒

最近在學習jvm,發現隨著對虛擬機器底層的瞭解,對java的多執行緒也有了全新的認識,原來一個小小的synchronized關鍵字裡別有洞天。決定把自己關於java多執行緒的所學整理成一篇文章,從最基礎的為什麼使用多執行緒,一直深入講解到jvm底層的鎖實現。 多執行緒的目的 為什麼要使用多執

使用角度 ReentrantLock 和 Condition

阻塞 transient string turn his 介紹 ner await dex java 語言中談到鎖,少不了比較一番 synchronized 和 ReentrantLock 的原理,本文不作分析,只是簡單介紹一下 ReentrantLock 的用法,從使用中

「前端資訊」剛上線的阿里達摩院官網,前端角度圈點之處

寫在前面: 從去年十月份,馬雲成立阿里巴巴達摩院,到今年9月28號一年整,阿里達摩院官網正式上線。作為從事網際網路行業的人,大抵都是會去達摩院官網看看的,本文即我個人從前端角度對達摩院官網,進行的一次簡單粗暴的測評,細數圈點之處,並提取一些作為前端可以值得借鑑和思考的程式碼技巧。第一次寫

原始碼角度Spring生命週期(官方最全)

Spring在beanfactory中給出了spring的生命週期的list列表 一、bean初始化前的處理 Bean factory implementations should support the standard bean lifecycle interfaces as

推廣角度:企業如何進行整合營銷

各種公司都在進行整合營銷,各個企業推廣負責人都在談論整合營銷的好處,到底什麼是整合營銷?企業如何進行整個營銷? 一、整合營銷的定義 其核心思想是將與企業進行市場營銷有關的一切傳播活動——例如一般廣告、直銷、銷售促進、公共關係以及CI、包裝和人員促銷——通過天衣無

「前端諮詢」剛上線的阿里達摩院官網,前端角度圈點之處

寫在前面: 從去年十月份,馬雲成立阿里巴巴達摩院,到今年9月28號一年整,阿里達摩院官網正式上線。作為從事網際網路行業的人,大抵都是會去達摩院官網看看的,本文即我個人從前端角度對達摩院官網,進行的一次簡單粗暴的測評,細數圈點之處,並提取一些作為前端可以值得借鑑和

JVM併發CPU記憶體指令重排序(Memory Reordering)

文中提到: 對主存的一次訪問一般花費硬體的數百次時鐘週期。處理器通過快取(caching)能夠從數量級上降低記憶體延遲的成本這些快取為了效能重新排列待定記憶體操作的順序。也就是說,程式的讀寫操作不一定會按照它要求處理器的順序執行。 這段話是作者對記憶體屏障重要性的定義。通過cache降低記憶

網際網路+角度雲端計算的現狀與未來(1)

此文已由作者劉超授權網易雲社群釋出。歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。網際網路這個詞目前已經普遍化,這大概也歸功於羅振宇的羅輯思維對於網際網路概念的極力宣揚,似乎不加上網際網路三個字,企業宣傳都張不開嘴。於是網際網路+這個名詞就隨處可見了。支撐網際網路化的一個重要的力量就是雲端計算。但現在的雲

資料角度人臉識別中Feature Normalization,Weight Normalization以及Triplet的作用 資料角度人臉識別中Feature Normalization,Weight Normalization以及Triplet的作用

轉 從資料角度看人臉識別中Feature Normalization,Weight Normalization以及Triplet的作用 2018年10月19日 16:42:52

JVM角度理解執行緒

http://blog.csdn.net/iter_zc/article/details/41843595 程式設計技術交流請加QQ群:點選連結加入群【Just Do IT】:https://jq.qq.com/?_wv=1027&k=478lBF3

原始碼角度for迴圈和foreach的區別

for迴圈和foreach的區別 關於for迴圈和foreach的區別,你真的知道,用了那麼多年使用起來已經很熟悉了,可突然問我講講這兩的區別,一下還真把我給卡住了一下,下面從原始碼的角度簡單分析一

JVM角度來看物件

在Java中要建立一個物件最簡單方法就是new,當然大部分情況下我們還是通過spring來管理物件。但對於JVM來說一個物件的建立、存亡可沒那麼簡單了。 物件的建立 虛擬機器遇到一條new指令時,首先去檢查這個指令的引數是否能在常量池中定位到一個類的符號

彙編角度c++引用(reference)

  每當提到c++中的引用時,我們的腦海中浮現的第一句話可能就是--引用就是一個變數的別名,但是引用的的型別到底是什麼?它和指標有什麼關係?它本身在記憶體中佔用空間麼?我們的編譯器是如何將它實現的呢?帶著這些疑問,我們今天就從彙編的角度來解析c++中的引用到底是什麼東西?

【Android體驗】使用者角度,Android手機/應用應該要這樣:

  入手HTC HERO已經半年,雖然自己也是計算機專業的,但是對這個手機,我還是儘量的希望能夠以一個普通的使用者角度來體驗的,所以一直都沒有去了解android開發方面的知識。不過,在使用的過程中,還是免不了麻煩不得不瞭解了很多本來就不應該是一個普通手機使用者要了解的知識。本文是Google 暑期大學生部

原始碼角度php自增和自減】

自增和自減基礎 學過程式語言的同學應該都可以隨口說出 ++a 和 a++ 的區別,具體的區別如下: Example Name Effect ++$a Pre-increment Increments abyone,then

網際網路+角度雲端計算的現狀與未來(2)

此文已由作者劉超授權網易雲社群釋出。歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。六、業務架構趨勢一:網際網路衝擊已成必然,快速變更成為核心競爭力,DevOps重構組織架構,流程,文化是必然選擇在業務架構方面,我這裡強調的是服務化。是解決如何避免開發和運維的黑天鵝問題。所

彙編角度C++類的方法訪問類成員的原理

C++編譯後最終也是生成了機器碼,不需要直譯器或虛擬機器來執行。相比C語言,C++的類大大的方便了程式碼結構的組織,使得構建大程式簡便容易了很多。例項化一個類後,類的成員方法就可以訪問這個類的成員了,那麼從彙編角度看,到底是如何實現的呢?其實這個原理也十分簡單,

【Android】原始碼角度Handler機制

在Android開發規範中,規定了主執行緒的任務的響應時間不能超過5s,否則會出現ANR,即程式無響應。為了避免這個問題的出現,常用的一個解決方案就是開闢新執行緒,在開闢出來的子執行緒中去處理耗時的業務,然後回到UI執行緒(主執行緒)來重新整理UI,這個過程中“

發展角度小企業需要上雲還是采購服務器 企業若自行部署物理服務器擔心其壽命問題

大發 穩定性 情況下 隨著 來看 雲主機 十年 穩定 因此 互聯網時代,信息快速傳遞,商品價格也越發透明,中大型企業無論在采購成本還是渠道上都占據優勢,本就處於劣勢的小企業處境更加艱難。 正所謂不想當將軍的士兵不是好士兵,小企業的核心目標是快速發展。因此少不了

對博弈活動中蘊含的資訊理論原理的討論,以及角度不同詞素抽象方式在WEBSHELL文字檢測中的效果區別

1. 從賽馬說起 0x1:賽馬問題場景介紹 假設在一場賽馬中有m匹馬參賽,令第i匹參賽馬獲勝的概率為pi,如果第i匹馬獲勝,那麼機會收益為oi比1,即在第i匹馬上每投資一美元,如果贏了,會得到oi美元的收益,如果輸了,那麼回報為0。 有兩種流行的馬票: a兌1(a-for-1):開賽前購買的馬票,