1.spring容器与springMVC容器冲突(spring version 4.0.2.RELEASE) php
SpringMVC容器是Spring容器的一个子容器,它一样可以初始化实体类。因为SpringMVC容器的初始化是在Spring容器初始化以后,因此它会替换Spring中已经存在的类,这样可能会致使冲突。web
(1)只在applicationContext.xml中配置以下spring
<context:component-scan base-package="com.pz" />
启动正常,可是任何请求都不会被拦截,简而言之就是@Controller失效express
(2)只在spring-servlet.xml中配置上述配置app
启动正常,请求也正常,可是事物失效,也就是不能进行回滚code
(3)在applicationContext.xml和spring-servlet.xml中都配置上述信息component
启动正常,请求正常,也是事物失效,不能进行回滚xml
所以将action单独配置在一个包中,若是已有项目没法改变,则用如下配置事务
<!--spring容器 --> <context:component-scan base-package="com.pz"> <!-- 不扫描@Controller --> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <!-- springMVC容器 --> <context:component-scan base-package="com.pz.web"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> </context:component-scan>
结论:在spring-servlet.xml中只须要扫描全部带@Controller注解的类,在applicationContext中能够扫描全部其余带有注解的类(也能够过滤掉带@Controller注解的类)。get
引用:由于spring的context是父子容器,因此会产生冲突,Controller会进步前辈行扫描装配,而此时的Service尚未进行事务的增强处理惩罚,得到的将是原样的Service(没有通过事务增强处理惩罚,故而没有事务处理惩罚才能) ,最后才是applicationContext.xml中的扫描设备进行事务处理惩罚