spring mvc 容器(spring mvc配置加载的servlet)从属于Context(ContextLoaderListener配置加载的spring上下文),如果同时配置了注解扫描,比如:
在spring-mvc.xml中如下:
<context:component-scan base-package="com.xxx,com.yyy,com.zzz">
<mvc:annotation-driven/>
在父容器中的spring-main.xml中:
<context:component-scan base-package="com"/>
如上,如果项目中存在某些service被2个容器同时扫描到,会促使这些service中声明式事务注解失效即使用@Transactional毫无作用。
解决方法:
在spring-mvc.xml中
<context:component-scan base-package="com.boco.ruleflow">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
如果2个容器配置的扫描没有冲突就没这么麻烦了。