Spring MVC DispatcherServlet contextConfigLocation設定
阿新 • • 發佈:2019-01-28
web.xml Spring 控制器配置
其中contextConfigLocation是怎麼 讀取 並設定到 DispatcherServlet 屬性中
<servlet>
<servlet-name>Dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation </param-name>
<param-value>/WEB-INF/Config.xml</param-value>
</init-param>
</servlet>
=============================================================
DispatcherServlet 的 父類 HttpServletBean 中 init方法,根據servlet生命週期,servlet例項建立後,容器會呼叫init方法初始化,此方法宣告為final 所以在其子類都不能重寫,所以當DispatcherServlet 例項建立後,容器呼叫初始化init方法就是執行的此方法。
Java程式碼
Java程式碼
======================================================================
如果忽略contextConfigLocation此設定,則預設為“/WEB-INF/<servlet name>-servlet.xml”,其中<servlet name>以Servlet 名替換
HttpServletBean 中 init方法中:
initServletBean()方法有子類FrameworkServlet重寫
在FrameworkServlet的initServletBean()方法中,
this.webApplicationContext = initWebApplicationContext();
完成DispatcherServlet 使用的webApplicationContext 的建立和初始化。
具體建立由FrameworkServlet的:
protected WebApplicationContext createWebApplicationContext(ApplicationContext parent) 方法實現,
在方法最後呼叫wac.refresh();初始化完成資原始檔定位,解析配置檔案生成Document物件,從這個物件中解析各個bean定義生成beanDefinition物件,最後註冊到該WebApplicationContext 容器中
在AbstractApplicationContext中提供了refresh()方法的實現。。。。。
在XmlWebApplicationContext中:
Java程式碼
getConfigLocations()獲取配置檔案的位置,實際呼叫了父類AbstractRefreshableConfigApplicationContext
中的:
Java程式碼
如果configLocations 已經有值就返回,沒有呼叫getDefaultConfigLocations()方法獲取預設的位置;
而getDefaultConfigLocations()方法由子類XmlWebApplicationContext重寫:
Java程式碼
DEFAULT_CONFIG_LOCATION_PREFIX + getNamespace()+DEFAULT_CONFIG_LOCATION_SUFFIX =
/WEB-INF/<servlet name>-servlet.xml
其中contextConfigLocation是怎麼 讀取 並設定到 DispatcherServlet 屬性中
<servlet>
<servlet-name>Dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation
<param-value>/WEB-INF/Config.xml</param-value>
</init-param>
</servlet>
=============================================================
DispatcherServlet 的 父類 HttpServletBean 中 init方法,根據servlet生命週期,servlet例項建立後,容器會呼叫init方法初始化,此方法宣告為final 所以在其子類都不能重寫,所以當DispatcherServlet 例項建立後,容器呼叫初始化init方法就是執行的此方法。
Java程式碼
- public final void init()
- throws ServletException
- {
- if(logger.isDebugEnabled())
- logger.debug("Initializing servlet '" + getServletName() + "'");
- try
- {
-
//ServletConfigPropertyValues是HttpServletBean 的內部類,作用是根據config物件獲取servlet中的配置資訊,封裝為PropertyValue物件放到propertyValueList的list中去
- org.springframework.beans.PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), requiredProperties);
- //包裝成BeanWrapper 物件
- BeanWrapper bw = new BeanWrapperImpl(this);
- org.springframework.core.io.ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
- bw.registerCustomEditor(org.springframework.core.io.Resource.class, new ResourceEditor(resourceLoader));
- initBeanWrapper(bw);
- //將封裝為PropertyValues 物件的配置資訊,設定到bean也就是DispatcherServlet 例項對應的屬性中。
- bw.setPropertyValues(pvs, true);
- }
- catch(BeansException ex)
- {
- logger.error("Failed to set bean properties on servlet '" + getServletName() + "'", ex);
- throw ex;
- }
- initServletBean();
- if(logger.isDebugEnabled())
- logger.debug("Servlet '" + getServletName() + "' configured successfully");
- }
Java程式碼
- private static class ServletConfigPropertyValues extends MutablePropertyValues
- {
- public ServletConfigPropertyValues(ServletConfig config, Set requiredProperties)
- throws ServletException
- {
- Set missingProps = requiredProperties == null || requiredProperties.isEmpty() ? null : ((Set) (new HashSet(requiredProperties)));
- //獲取DispatcherServlet 在web.xml中的配置的所有<init-param>的名字
- Enumeration en = config.getInitParameterNames();
- do
- {
- if(!en.hasMoreElements())
- break;
- String property = (String)en.nextElement();
- //獲取對應名字的值
- Object value = config.getInitParameter(property);
- addPropertyValue(new PropertyValue(property, value));
- if(missingProps != null)
- missingProps.remove(property);
- } while(true);
- if(missingProps != null && missingProps.size() > 0)
- throw new ServletException("Initialization from ServletConfig for servlet '" + config.getServletName() + "' failed; the following required properties were missing: " + StringUtils.collectionToDelimitedString(missingProps, ", "));
- else
- return;
- }
- }
======================================================================
如果忽略contextConfigLocation此設定,則預設為“/WEB-INF/<servlet name>-servlet.xml”,其中<servlet name>以Servlet 名替換
HttpServletBean 中 init方法中:
initServletBean()方法有子類FrameworkServlet重寫
在FrameworkServlet的initServletBean()方法中,
this.webApplicationContext = initWebApplicationContext();
完成DispatcherServlet 使用的webApplicationContext 的建立和初始化。
具體建立由FrameworkServlet的:
protected WebApplicationContext createWebApplicationContext(ApplicationContext parent) 方法實現,
在方法最後呼叫wac.refresh();初始化完成資原始檔定位,解析配置檔案生成Document物件,從這個物件中解析各個bean定義生成beanDefinition物件,最後註冊到該WebApplicationContext 容器中
在AbstractApplicationContext中提供了refresh()方法的實現。。。。。
在XmlWebApplicationContext中:
Java程式碼
- protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws IOException {
- String[] configLocations = getConfigLocations();
- if (configLocations != null) {
- for (String configLocation : configLocations) {
- reader.loadBeanDefinitions(configLocation);
- }
- }
- }
getConfigLocations()獲取配置檔案的位置,實際呼叫了父類AbstractRefreshableConfigApplicationContext
中的:
Java程式碼
- protected String[] getConfigLocations() {
- return (this.configLocations != null ? this.configLocations : getDefaultConfigLocations());
- }
如果configLocations 已經有值就返回,沒有呼叫getDefaultConfigLocations()方法獲取預設的位置;
而getDefaultConfigLocations()方法由子類XmlWebApplicationContext重寫:
Java程式碼
- protected String[] getDefaultConfigLocations() {
- if (getNamespace() != null) {
- return new String[] {DEFAULT_CONFIG_LOCATION_PREFIX + getNamespace() + DEFAULT_CONFIG_LOCATION_SUFFIX};
- }
- else {
- return new String[] {DEFAULT_CONFIG_LOCATION};
- }
- }
DEFAULT_CONFIG_LOCATION_PREFIX + getNamespace()+DEFAULT_CONFIG_LOCATION_SUFFIX =
/WEB-INF/<servlet name>-servlet.xml