本身單獨作了個小網站 可是發現action事務不起做用了 可是若是用service層就沒問題 找了不少辦法沒解決 最後本身解決了程序員
其實就是一個加載順序的問題web
首先使用了spring MVC的項目是不須要配置action bean 而是經過spring mvc的配置文件進行掃描註解加載的spring
spring事務配置文件還有上下文都是經過org.springframework.web.context.ContextLoaderListener加載的,編程
而spring MVC的action是經過org.springframework.web.servlet.DispatcherServlet加載的 mvc
這樣就有個優先級的問題了 web是先啓動ContextLoaderListener後啓動DispatcherServletjsp
在ContextLoaderListener加載的時候action並沒在容器中,因此如今使用AOP添加事務或者掃描註解都是無用的。網站
那麼解決辦法就是在DispatcherServlet 加載spring-MVC配置文件後再進行一次AOP事務掃描和註解事務掃描就OK了spa
<tx:annotation-driven transaction-manager="transactionManager"/> <aop:config> <aop:advisor advice-ref="transactionAdvice" pointcut="execution(* com.yang.web.*.action.*.*(..))"/> </aop:config>
至於爲何要在Action中加事務code
spring in action 一書中也說過 service dao action 是很經典的組合但不是必須的,對於一個簡單的增刪改查系統,不必分那麼多層,好比一個簡單保存功能 無非就new 一個實體 映射參數 使用了spring jdbcTemplate 保存就一行代碼 就一個這麼簡單的功能有必要 一個service接口 一個service實現類 一行代碼調用一個dao接口一個dao實現類 要多建四個類 還要在spring上下文中配置 不累嗎? 對於一個簡單的系統而言這就是爲本身找不自在 明明蓋的是民房 硬要打摩天大樓的地基 orm
另有一篇博客也是這樣說的
http://elf8848.iteye.com/blog/875830
5、父子上下文(WebApplicationContext) 方法二激進型
方案二,激進型:
Java世界的「面向接口編程」的思想是正確的,但在增刪改查爲主業務的系統裏,Dao層接口,Dao層實現類,Service層接口,Service層實現類,Action父類,Action。再加上衆多的O(vopobo)和jsp頁面。寫一個小功能 七、8個類就寫出來了。 開發者說我就是想接點私活兒,和PHP,ASP搶搶飯碗,但我又是Java程序員。最好的結果是大項目能作好,小項目能作快。因此「激進型」方案就出現了—–沒有接口、沒有Service層、還能夠沒有衆多的O(vopobo)。那沒有Service層事務控制在哪一層?只好上升的Action層。
本文不想說這是否是正確的思想,我想說的是Spring不會限制你這樣作。
Java–大項目能作好–按傳統方式作,規規矩矩的作,好擴展,好維護。
Java–小項目能作快–按激進方式作,一週時間就能夠出一個版本,先上線接受市場(用戶)的反饋,再改進,再反饋,時間就是生命(成本)。