1)关系说明
spring 与 springmvc 父子关系:spring (父容器),springmvc (子容器)
springmvc(子)--- 可调用 --> spring(父) 中的 bean,属性值等
但 spring(父)-- 不可调用 --> springmvc(子) 中的 bean,属性值等
2)配置原则
spring-context.xml
<!-- 启动组件扫描,排除@Controller的组件,因为控制器组件由SpringMVC配置文件扫描 --> <context:component-scan base-package="com.***.***"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
springmvc.xml
<!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器,要有use-default-filters="false" --> <context:component-scan base-package="com.***.***.controller" > <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
success:
url --> servlet --> springmvc(访问 controller,所以 controller 必须放到springmvc容器)
springmvc --> spring(controller 调用 service,dao)
error:
把 controller 放到 spring 容器,不放到 springmvc 出现的问题:
url --> servlet --> springmvc(spring 会将扫描的对象都会存放到 spring 的容器,而不会放到 springmvc 子容器中,当访问项目的时候,springmvc 通过处理器映射器找不到和其对应的 Controller,报
404 错误! )
spring 容器不扫描,全部放到 springmvc 中扫描出现的问题:
在里面可以同时扫描 controller层、service层、dao层 的注解,但是,子容器controller 进行扫描装配时装配了 @Service注解 的实例,而该实例理应由父容器进行初始化以保证事务的增强处理(因为事务管理器是配置在 spring 容器中的),所以此时得到的将是原样的 Service(没有经过事务加强处理,没有事务处理能力,无法访问到事务对象,导致事务失效)
@Value("${name}") 取不到 properties 文件中定义的变量值
<!-- 配置文件引入 --> <context:property-placeholder location="classpath:application.properties" ignore-resource-not-found="true" ignore-unresolvable="true" />
service,dao 中不能 @Value 配置在 springmvc.xml 的properties (父容器 -- 不能访问 --> 子容器 的东西)