docs: private WebApplicationContext prepareRootApplicationContext() throws IOException {
  
          if (logger.isInfoEnabled()) {
              logger.info("[init/rootContext] starting ...");
          }
  
          ApplicationContext oldRootContext = (ApplicationContext) getServletContext().getAttribute(
                  ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
  
          // 如果web.xml配置使用了spring装载root应用context ...... 不可以
          // roseFilter可能因为启动失败，在请求的时候容器还会尝试重新启动，此时rootContext可能已经存在，不要简单地抛出异常
          // 同时这样留出了使用Listener作为init rose context的扩展机会
          if (oldRootContext != null) {
              if (oldRootContext.getClass() != RoseWebAppContext.class) {
                  throw new IllegalStateException(
                          "Cannot initialize context because there is already a root application context present - "
                                  + "check whether you have multiple ContextLoader* definitions in your web.xml!");
              }
              if (logger.isInfoEnabled()) {
                  logger.info("[init/rootContext] the root context exists:" + oldRootContext);
              }
              return (RoseWebAppContext) oldRootContext;
          }
  
          RoseWebAppContext rootContext = new RoseWebAppContext(getServletContext(), load, false);
  
          String contextConfigLocation = this.contextConfigLocation;
          // 确认所使用的applicationContext配置
          if (StringUtils.isBlank(contextConfigLocation)) {
              String webxmlContextConfigLocation = getServletContext().getInitParameter(
                      "contextConfigLocation");
              if (StringUtils.isBlank(webxmlContextConfigLocation)) {
                  contextConfigLocation = RoseWebAppContext.DEFAULT_CONFIG_LOCATION;
              } else {
                  contextConfigLocation = webxmlContextConfigLocation;
              }
          }
          rootContext.setConfigLocation(contextConfigLocation);
          rootContext.setId("rose.root");
          
          rootContext.refresh();
  
          if (logger.isInfoEnabled()) {
              logger.info("[init/rootContext] exits");
          }
  
          /* enable: WebApplicationContextUtils.getWebApplicationContext() */
          getServletContext().setAttribute(ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, rootContext);
  
          if (logger.isInfoEnabled()) {
              logger.info("[init/rootContext] Published rose.root WebApplicationContext ["
                      + rootContext + "] as ServletContext attribute with name ["
                      + ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE + "]");
          }
  
          return rootContext;
      }