菜鸟笔记:如有不对的地方,欢迎大家指正,谢谢!
spring+springmvc事务失效,一般都是因为注解的重复扫描导致。
spring的context是父子容器,所以会产生冲突,由ServletContextListener产生的是父容器,springMVC产生的是子容器,子容器Controller进行扫描装配时装配了@Service注解的实例,而该实例理应由父容器进行初始化以保证事务的增强处理,所以此时得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力。)
简单的说,应用了事务的service注解实例,本来是要被spring扫描装配来保证事务,但是却被springmvc扫描装配了,这就导致了事务的失效。
解决办法就是,springmvc只扫描装配controller注解的实例,其它的注解实例交给spring来处理。
具体实现如下:
spring.xml主要负责一些事务逻辑的扫描,使用context:exclude-filter过滤掉controller,需要注意:这个包名不需要精确。
<span style="color:#000099;">context:exclude-filter意思是:不扫描<span style="font-family: Arial, Helvetica, sans-serif;">expression="org.springframework.stereotype.Controller"中指定的注解,其它的都扫描。</span></span>
<context:component-scan base-package="com.travelsky>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
springmvc的xml中只对controller的扫描,使用<context:include-filter 来限制扫描的时候,需要注意:包名必须精确,否则 <context:include-filter限制失效
<span style="color:#000099;">context:include-filter意思是:只扫描</span><span style="font-family: Arial, Helvetica, sans-serif;"><span style="color:#000099;">expression="org.springframework.stereotype.Controller"中指定的注解。</span></span>
<span style="font-family:Arial, Helvetica, sans-serif;color:#000099;">
</span><span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java"><context:component-scan base-package="com.test.controller>
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>