2014-09-06 18 views
0

我想知道spring如何改變我的@transactional註解方法?例如 我讀了here關於如何在不使用@transactional的情況下運行事務性方法。 究竟是什麼春天呢?@transactional是如何工作的?

+0

基本上Spring創建動態代理 - 代替您的類的類並在您的方法周圍添加事務行爲。該文檔將給你所有的細節http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html#transaction-strategies,http://docs.spring.io/ spring/docs/current/spring-framework-reference/html/transaction.html#tx-decl-explained – geoand 2014-09-06 13:11:27

+0

@geoand出於好奇,你爲什麼在評論中回答問題而不是發佈答案? – 2014-09-06 15:51:16

+0

@Ricardo我不得不寫更多的東西來保證真正的答案。我會解決這個問題 – geoand 2014-09-06 17:43:31

回答

1

Spring有效地爲您的對象製作代理。因此,如果類「MyApplication」注入「DBService」,並且DBService上有一個@Transactional,那麼spring將創建一個DBService代理。代理將被注入到MyApplication中,並且所有對DBService的方法的調用將改爲調用該代理。然後,該代理將被允許在調用實際的DBService方法之前啓動事務或執行所需的任何操作。

MyApplication -> DBService Proxy (intercepts calls) -> DBService 

根據春季版本和您設置代碼的方式,可以更改代理的詳細信息。你可以使用接口允許spring做一個代理,但是,如果你選擇不使用接口,spring也可以擴展實際的類(使用一個名爲CGLIB的庫,前4個,這需要一個默認構造函數,儘管在最新的Spring 4默認的構造函數不是必需的,它通過一個稍微不同的機制來實現)