2010-11-11 30 views
12

我正在建立一個新的JPA + Spring項目。是什麼區別(我作爲一個程序員):在我的applicationContext.xmlSpring:註釋驅動的事務管理器

<tx:annotation-driven transaction-manager="transactionManager" /> 

<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" /> 

回答

28

代理和字節代碼weaven方面有很大的區別。如果調用來自「外部空間」如果調用來自對象本身 代理只能攔截,但不能(this.transactionalMethod())

這意味着,如果你有兩種方法,T和B一類。方法T有一個事務註釋,並且方法B調用T「this.T()「,則永遠不會調用代理(對於T),所以在這種情況下沒有事務處理!

如果使用AspectJ,事務處理代碼在字節代碼T中是weaven,並且無論調用來自對象本身還是來自其他對象,它都將被執行。

+0

非常感謝你用清晰簡單的詞語解釋。 – 2016-03-12 07:43:03

6

The docs說:

默認模式「代理」註解的bean使用Spring的AOP框架來代理程序(以下代理語義,如上所述,申請方法調用只有到來在通過代理)。替代模式「aspectj」用Spring的AspectJ交易方面編織受影響的類,修改目標類字節代碼以應用於任何類型的方法調用。 AspectJ編織要求classpath中的spring-aspects.jar以及啓用加載時織入(或編譯時織入)。 (有關如何設置加載時織入的詳細信息,請參見第7.8.4.5節「彈簧配置」。)

從開發人員的角度來看,使用哪種模式並不重要。

+0

哦謝謝。由於某種原因我找不到這些信息。 – 2010-11-11 15:26:04