Spring3MVC+Mybatis3.1框架下的事务

这一生的挚爱 提交于 2019-12-02 23:34:17

最近做一个项目,项目的框架采用是Spring3MVC+MyBatis3.1。可是在开发过程中发现配置的事务不管用。

出现这个问题的现象是用Junit调试事务管用,而部署到Tomcat中就不管用了。先看看事务的配置:

<!--proxy-target-class="true"强制使用cglib代理   如果为false则spring会自动选择-->
<aop:aspectj-autoproxy proxy-target-class="true"/>

<!-- Transaction manager for a single JDBC DataSource -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="save*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>


<aop:config>
<aop:pointcut expression="execution(public * com.luyou.platform.service.impl.*Impl.*(..))" id="pointcut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>


采用以下两种方法调试:

一、Debug视图

 1、Junit下的

发现配置事务的AOP已经包进来了。再看看Tomcat中运行的Debug截图:

显然AOP没有被包进来。


二、Log4J的记录:

Junit下的记录:

Spring托管了事务。

Tomcat运行时的记录:

Spring没有托管事务。


从以上两种方法的调试说明了,事务的配置是正确的,只是在部署到Tomcat中,没有被托管。为什么会在Junit的时候就可以呢?得看看Junit的配置:

@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
@ContextConfiguration("classpath:applicationContext.xml")

这是Junit加载Spring容器的注解。ContextConfiguration会把applicationContext.xml的Bean都加载了,这就说明Tomcat在运行时没有将applicationContext.xml的Bean加载进来。问了前辈,前辈的回话是这样的:

切面配置在了root applicationContext的bean上了,而spring mvc会根据xxx-servelt.xml生成一个自己的applicationContext,他的父applicationContext为root applicatonContext,当mvc有自己的bean时便不再去向父context要bean,导致声明事务无效。

看了前辈的这个邮件,我将applicationContext.xml中配置事务的AOP复制到XXX-servlet.xml中。再调试,Tomcat中运行项目事务被Spring托管了,也就是问题解决了!!

问题解决后查看了Spring3.1的Docs发现了以下的内容:

These inherited beans can be overridden in the servlet-specific scope, and you can define new scope-specific beans local to a given Servlet instance.
Context hierarchy in Spring Web MVC Upon initialization of a DispatcherServlet, Spring MVC looks for a file named [servlet-name]-servlet.xml in the WEB-INF directory of your web application and creates the beans defined there, overriding the definitions of any beans defined with the same name in the global scope.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!