Spring、SpringMVC父子容器关系浅析

浅析配置文件:

web.xml


...

<context-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>classpath:spring/applicationContext.xmlparam-value>
context-param>

<listener>
        <description>spring监听器description>
        <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
    listener>

    
    <servlet>
        <description>spring mvc servletdescription>
        <servlet-name>springMvcservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
            <description>配置spring mvc加载的配置文件(配置处理器映射器、适配器等等)description>
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:spring/dispatcher-servlet.xmlparam-value>
        init-param>
        
        <load-on-startup>1load-on-startup>
    servlet>
    <servlet-mapping>
        <servlet-name>springMvcservlet-name>
        
        <url-pattern>/rest/*url-pattern>
        
    servlet-mapping>

    ...

如上配置所示:ContextLoaderListener监听器是装载Spring框架本身的bean上下文(如Service和DAO层等),DispatcherServlet是装载SpringMVC的上下文。

ContextLoaderListener自动扫描配置(applicationContext.xml)

    ...

    
    "com.taotao" />

    ...

上述的配置指定了ContextLoaderListener所创建的Spring容器将扫描com.taotao包下所有的注解。

DispatcherServlet配置(dispatcher-servlet.xml)

    ...

    
    "com.taotao.manager.controller" />

    ...

上面配置是指定了DispatcherServlet所创建的springMVC容器只扫描controller控制层的beans,当然在dispatcher-servlet.xml中还可以指定视图解析、JSON转换、上传下载等配置信息。

在上面的配置中,Spring容器(上下文)创建完成之后,当初始化springMVC容器的时候,就会将之前初始化的Spring容器设置为它的父容器。如果项目中没有初始化Spring父容器,springMVC也会初始化一个默认的父容器。

Spring容器  --  父容器
SpringMVC容器  -- 子容器

父子容器的关系:
1、子容器能够访问父容器的资源(bean)
a)示例:Controller可以注入Service
2、父容器不能访问子容器的资源(bean)

注意:上面的配置中springMVC子容器所扫描的包只能限定在controller包,如果将Spring容器和springMVC容器所扫描的包都配置成全部的,就会造成在子容器和父容器都有全部的自定义beans。当子类容器中装载了Service和DAO,控制层就会使用子类容器所装载的bean去执行。但是这里面的service是没有事务等功能的(没有Spring框架的配置),只是普通的bean,因此使用起来会有不可预知的问题。

关于加载自定义下属性文件

Spring、SpringMVC父子容器关系浅析_第1张图片

一、spring容器中加载

Spring、SpringMVC父子容器关系浅析_第2张图片
由于@Vaule注解只能在当前所在容器中获取值,所以在Controller中使用@Value注解只能在springMVC容器中取值,没法取到spring容器中加载的配置文件的值,只能参考如下“曲线救国”的方式:
Spring、SpringMVC父子容器关系浅析_第3张图片
Spring、SpringMVC父子容器关系浅析_第4张图片

二、springMVC容器中加载

Spring、SpringMVC父子容器关系浅析_第5张图片
controller中直接使用注解@Value获取配置文件的值。
Spring、SpringMVC父子容器关系浅析_第6张图片

你可能感兴趣的:(Spring,SpringMVC,&,Struts)