浅析配置文件:

web.xml


...

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/applicationContext.xml</param-value>
</context-param>

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

    <!-- spring mvc 前端控制器servlet -->
    <servlet>
        <description>spring mvc servlet</description>
        <servlet-name>springMvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <description>配置spring mvc加载的配置文件(配置处理器映射器、适配器等等)</description>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/dispatcher-servlet.xml</param-value>
        </init-param>
        <!-- 1容器启动时初始化该servlete, 0第一次访问的时候初始化该servlet -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springMvc</servlet-name>
        <!-- 可行: /、*.xxx、/xxx/* 不可行: /* (struct中可以这样配置,原因是struct和springmvc的入口不一样,struct入口是Filter,springmvc入口是servlet,在servlet中“/”就代表全部了) -->
        <url-pattern>/rest/*</url-pattern>
        <!-- <url-pattern>*.do</url-pattern> -->
    </servlet-mapping>

    ...

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

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

    ...

    <!-- 扫描包 -->
    <context:component-scan base-package="com.taotao" />

    ...

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

DispatcherServlet配置(dispatcher-servlet.xml)

    ...

    <!-- 扫描Controller -->
    <context:component-scan base-package="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容器中加载

这里写图片描述
由于@Vaule注解只能在当前所在容器中获取值,所以在Controller中使用@Value注解只能在springMVC容器中取值,没法取到spring容器中加载的配置文件的值,只能参考如下“曲线救国”的方式:
这里写图片描述
这里写图片描述

二、springMVC容器中加载

这里写图片描述
controller中直接使用注解@Value获取配置文件的值。
这里写图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐