最近項目在用springMVC+spring+myBatis框架,在配置事務的時候發現一個事務不能回滾的問題。
剛開始配置如下:springMVC.xml配置內容:
spring.xml配置內容
從上面兩個配置文件看出,開始的時候我把Service配置在springMVC中的。但是,事務注解我配置在了spring中。這樣就會出現問題了。因為spring的容器(applicationContext)和springMVC的(applicationContext)是不同的。
spring容器加載得時候,優先加載ServletContextListener(對應spring.xml)產生的父容器,而springMVC(對應springMVC.xml)產生的是子容器。子容器Controller進行掃描裝配時裝配的@Service注解的實例是沒有經過事務加強處理,
即沒有事務處理能力的Service。而父容器進行初始化的Service是保證事務的增強處理能力的。如果不在子容器中將Service除去掉,此時得到的將是原樣的無事務處理能力的Service。
所以,我們應把掃描Service的工作放在spring.xml中。讓Service和事務注解存在於同一個容器中,這樣配置的事務注解就能起作用了。也就是說把<context:component-scan base-package="com.services" />這個配置從
springMVC.xml中移到spring.xml的配置中。事務不回滾的問題就能解決了。