1. 程式人生 > >【事務】關於Spring事務加了@Transational還是無法啟用的解決方案

【事務】關於Spring事務加了@Transational還是無法啟用的解決方案

扯淡最近的專案又被別人改了配置檔案,還好寫了一個數據前後處理順序錯誤引發的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原始碼的解析書籍.

雖然我也不是十分透徹這些機制,但是當全部人搞不定而一下子看出問題的時候...咳咳, 微笑一下就好.