【事務】關於Spring事務加了@Transational還是無法啟用的解決方案
阿新 • • 發佈:2018-12-16
扯淡最近的專案又被別人改了配置檔案,還好寫了一個數據前後處理順序錯誤引發的BUG發現報異常時資料卻被刪除了驚醒怎麼事務沒了。
前言:
Spring配置之前寫了有3個檔案
①spring-context 一般管理配置檔案注入
<!-- springMVC配置 --> <import resource="spring-mvc.xml"/> <!-- mybatis配置 --> <import resource="spring-mybatis.xml"/> <!-- shiro配置 --> <import resource="spring-shiro.xml"/>
或是一些不屬於前端互動、不屬於mybatis框架相關的東西 放這
②spring-mvc
一般就是前端相關, 如配置前後綴、編碼格式、檔案上傳限制大小等等等等
③spring-mybatis
一般是配置DB連線資訊 + 事務管理 + 持久層介面對映檔案掃描, aop如果有的話一般和事務放一起。
被同事改了配置問題出在哪裡呢,說到底我也不明白為什麼他要改配置,出發點在哪裡我到現在還沒理解
原本:
1.spring-context裡要配置自動注入到Spring容器, 但是要排除@Service這個Impl實現類裡新增的註解, 原因是因為(本專案中)spring容器優先載入spring-context.xml產生的容器, 而此時並沒有在spring-context中配置事務 , 故生成的例項物件沒有經過事務加強處理是沒有事務能力的. 需要在spring-context中exclude掉, 其他照常掃描
<context:component-scan base-package="com.xxxx">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
2.spring-mybatis裡要配置自動注入
<!-- 自動掃描com.XXX下的service.impl --> <context:component-scan base-package="com.xxxx.*" > <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
這裡由於我們專案中多個同級包中都可能有@Service , 甚至有些util工具類都加上了@Service作為介面使用,故為com.xxx.*, 此處各位根據自己的去定義即可.
這裡要exclude掉Controller是因為之前spring-context已經掃描過了.
要搞清楚這些配置的機制, 推薦讀一下Spring原始碼的解析書籍.
雖然我也不是十分透徹這些機制,但是當全部人搞不定而一下子看出問題的時候...咳咳, 微笑一下就好.