我正在建立一個新的JPA + Spring項目。是什麼區別(我作爲一個程序員):在我的applicationContext.xmlSpring:註釋驅動的事務管理器
<tx:annotation-driven transaction-manager="transactionManager" />
和
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />
?
我正在建立一個新的JPA + Spring項目。是什麼區別(我作爲一個程序員):在我的applicationContext.xmlSpring:註釋驅動的事務管理器
<tx:annotation-driven transaction-manager="transactionManager" />
和
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />
?
代理和字節代碼weaven方面有很大的區別。如果調用來自「外部空間」如果調用來自對象本身 代理只能攔截,但不能(this.transactionalMethod())
這意味着,如果你有兩種方法,T和B一類。方法T
有一個事務註釋,並且方法B
調用T
「this.T()
「,則永遠不會調用代理(對於T
),所以在這種情況下沒有事務處理!
如果使用AspectJ,事務處理代碼在字節代碼T
中是weaven,並且無論調用來自對象本身還是來自其他對象,它都將被執行。
The docs說:
默認模式「代理」註解的bean使用Spring的AOP框架來代理程序(以下代理語義,如上所述,申請方法調用只有到來在通過代理)。替代模式「aspectj」用Spring的AspectJ交易方面編織受影響的類,修改目標類字節代碼以應用於任何類型的方法調用。 AspectJ編織要求classpath中的spring-aspects.jar以及啓用加載時織入(或編譯時織入)。 (有關如何設置加載時織入的詳細信息,請參見第7.8.4.5節「彈簧配置」。)
從開發人員的角度來看,使用哪種模式並不重要。
哦謝謝。由於某種原因我找不到這些信息。 – 2010-11-11 15:26:04
非常感謝你用清晰簡單的詞語解釋。 – 2016-03-12 07:43:03