淺析配置文件:
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獲取配置文件的值。