在搭建ssm项目过程中遇到了,配置的事务不起作用的问题,百度了下,原因大概就是包扫描的问题:spring的配置文件application.xml中包扫描不需要扫描@Controller注解的, 具体如下:
<context:component-scan base-package="com.practice.controller">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
springMVC配置文件springMVC-servlet.xml中只需要扫描@Controller注解的,具体如下:
<context:component-scan base-package="com.practice.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>
事务配置我用的是声明式事务配置,在application.xml中配置的,具体如下:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 开启事务控制的注解支持 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
用的时候只需要在需要事务管理的类上或方法上加@Transactional就行,当然可以在@Transactional后进行更加详细的配置,此处不是重点,就不讲了。
所以反过来,如果不移动配置,那么就需要将@Transactional加到service层中的类或方法上。
由此可见,我们就需要养成良好的分层习惯,因为一般的公司和项目都会分层,而如果我们没分层或者分的混乱,那么可能在别人那不会遇到的问题自己就会遇到,即使代码可能完全一样。另外,还说明了一个问题:那就是spring容器和spring mvc容器之间是层级关系的,具体的就是spring容器是spring mvc容器的父容器,在spring中的配置可以整个项目使用,spring mvc中的配置只能在spring mvc 作用范围内,也就是说spring mvc可以使用spring中配置的,spring不可以使用spring mvc中配置的。