spring配置文件:
<!--不掃描controller-->
context:component-scan
base-package="com.xx">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
<context:exclude-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice" />
</context:component-scan>
SpringMVC配置文件:
<!-- 自動掃描該包,SpringMVC只掃描controllerr -->
<context:component-scan
base-package="com.xx.controller">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
<context:include-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice" />
</context:component-scan>
Spring-Mybatis配置文件:
<!-- 配置事務管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置基於註解的聲明式事務 @Transactional -->
<!--proxy-target-class="true"表示支持CGLB代理,如果不加,只支持JDK的代理,默認只支持面向接口,也就是說放在實現類上,事務不生效-->
<tx:annotation-driven
transaction-manager="transactionManager" proxy-target-class="true" />
爲什麼要分開配置spring 和 SpringMVC的掃描?
因爲spring的context是父子容器,ContextLoaderListener監聽器加載spring配置文件,
產生的是父容器,mvc加載mvc的配置文件,產生了子容器,子容器對@Controller進行裝配掃描時,
也裝配了@Service註解的實例,因爲在@Contoller實例依賴@Service實例,而@Service註解的實例,
也就是一般的事務控制層,應該是有父容器初始化,以保證事務的增強處理,否則會事務事務處理能力。
XxserviceImpl:
//在catch中有兩種處理方法,1.拋出去異常,讓controllerAdvice處理.
//2.手動回滾,下面例子爲手動回滾
//該註解可配置在類,方法上。作用域public
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteLineAndTowerById(String id) {
try {
aaMapper.deleteById(id);
int i = 5 / 0;
bbMapper.deleteById(id);
} catch (Exception e) {
log.error("錯誤信息:" + e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
注意:InnoDB引擎支持事務,在my.ini中的【mysqlId】下添加default-storage-engine=INNODB
具體的事務類型在public enum Propagation 枚舉中,默認爲Required