spring mvc中AOP事物的配置,AOP事物不生效解决办法

spring mvc中很多时候都会配置扫描其,如

<context:component-scan base-package="XX.XX.*" />

扫描spring mvc的注解,此时如果在其他spring配置文件中,配置AOP的事物,如本人使用mybatis,在spring-mybatis中有如下配置,配置事物处理,处理事物

<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
    </bean>
	<tx:advice id="userTxAdvice" transaction-manager="transactionManager">  
	  <tx:attributes>  
	      <tx:method name="delete*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" no-rollback-for="java.lang.RuntimeException"/>  
	      <tx:method name="add*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" />  
	      <tx:method name="insert*" propagation="REQUIRED" isolation="SERIALIZABLE" read-only="false" rollback-for="java.lang.Exception" />  
	      <tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" />  
	      <tx:method name="modify*" propagation="REQUIRES_NEW" read-only="false" rollback-for="java.lang.Exception" />  
	      <tx:method name="find*" propagation="SUPPORTS"/>  
	      <tx:method name="get*" propagation="SUPPORTS" isolation="SERIALIZABLE"/>  
	      <tx:method name="select*" propagation="REQUIRED" isolation="SERIALIZABLE"/>  
	  </tx:attributes>  
	</tx:advice>  
	<aop:config>
	    <aop:pointcut id="pc" expression="execution( * *.service..*.*(..))" /> <!-- 把事务控制在Service层 -->  
	    <aop:advisor pointcut-ref="pc" advice-ref="userTxAdvice" />  
	</aop:config>  
此时发现service 层的事物并没有生效,

度娘后结合项目分析,得出结论,若不正确欢迎指正,由于初始化时先加载了spring-mvc.xml配置文件此时由于配置的扫描器包含了service层,此时并没有加入AOP,所有AOP不能对事物进行管理,在词加载spring-mybatis配置文件,此时虽然有aop但是,因为容器的原因,将会导致,使用的service并不是后面加载的service,所以虽然配置了事物管理却不生效

解决办法:

添加列外,感觉有点像spring mvc 的interceptor添加例外,

通过exclude-filter标签添加例外如:

 <context:component-scan  base-package="pack.*" > 
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
      </context:component-scan> 

对其进行列外处理,解决该问题。


网页都说使用此方式,将会导致try..catch的事物处理不生效,本人没有验证,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章