如何給Spring MVC的action加上事務
阿新 • • 發佈:2019-02-05
其實就是一個載入順序的問題
首先使用了spring MVC的專案是不需要配置action bean,而是通過spring mvc的配置檔案進行掃描註解載入的,spring事務配置檔案還有上下文都是通過org.springframework.web.context.ContextLoaderListener載入的,而spring MVC的action是通過org.springframework.web.servlet.DispatcherServlet載入的,這樣就有個優先順序的問題了,web是先啟動ContextLoaderListener後啟動DispatcherServlet,在ContextLoaderListener載入的時候action並沒在容器中,所以現在使用AOP新增事務或者掃描註解都是無用的。
那麼解決辦法就是在DispatcherServlet載入的spring-MVC配置檔案後再加上AOP事務掃描配置就OK了
1 2 3 4 5 6 7 8 |
< tx:advice id = "defaultTxAdvice" transaction-manager = "transactionManager" >
< tx:attributes >
< tx:method name = "questionReply" propagation = "REQUIRED" />
</ tx:attributes >
</ tx:advice >
< aop:config >
< aop:advisor advice-ref = "defaultTxAdvice" pointcut = "execution(* com.jeecms.cms.action.front.PhQuestionAct.*(..))" />
</ aop:config >
|
至於為什麼要在Action中加事務
spring in action 一書中也說過 service dao action 是很經典的組合但不是必須的,對於一個簡單的增刪改查系統,沒必要分那麼多層,比如一個簡單儲存功能 無非就new 一個實體 對映引數 使用了spring jdbcTemplate 儲存就一行程式碼 就一個這麼簡單的功能有必要 一個service介面 一個service實現類 一行程式碼呼叫一個dao介面一個dao實現類 要多建四個類 還要在spring上下文中配置不累嗎?對於一個簡單的系統而言這就是為自己找不自在,明明蓋的是民房,硬要打摩天大樓的地基。