博客专栏 产品中心 技能中心

Spring 与 SpringMVC 容器父子关系引出的相应问题

· 原创专栏 · 阅读 5

1)关系说明

  1. spring 与 springmvc 父子关系:spring (父容器),springmvc (子容器)

  2. springmvc(子)--- 可调用 --> spring(父) 中的 bean,属性值等

  3. 但 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 (父容器 -- 不能访问 --> 子容器 的东西)

关注公众号,分享干货,讨论技术