Spring、SpringMVC父子容器關係淺析

淺析配置文件:

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獲取配置文件的值。
這裏寫圖片描述

發佈了107 篇原創文章 · 獲贊 201 · 訪問量 55萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章