项目启动之spring篇

  • 时间:
  • 浏览:1

       # return (ConfigurableWebApplicationContext)BeanUtils.instantiateClass(this.determineContextClass(sc));

   static {

}

                throw new ApplicationContextException("Failed to load custom context class [" + contextClassName + "]", var4);

            throw new IllegalStateException("Could not load 'ContextLoader.properties': " + var1.getMessage());

                ClassLoader ccl = Thread.currentThread().getContextClassLoader();

            ClassPathResource resource = new ClassPathResource("ContextLoader.properties", ContextLoader.class);

                } else if (ccl != null) {

                return ClassUtils.forName(contextClassName, ContextLoader.class.getClassLoader());

                    this.context = this.createWebApplicationContext(servletContext);

# 在XWAC中提供了默认的配置文件位置

           ....

        if (contextClassName != null) {

    protected Class<?> determineContextClass(ServletContext servletContext) {

小结一下:   tomcat启动有的是给配置在web.xml中指定的lisener传递有有另一个 多事件,让其初始化创建有有另一个 多WebApplicationContext对象,并将其加入到ServletContext中。而在spring-web中ContextLoaderListener类为亲戚亲戚他们都 提供使用默认或自定义四种 生成WebApplicationContext对象,不需要 使用自定义则不需要 在web.xml中指定contextClass属性,然后创建对应的类。创建好了context然后,下一步便是加载applicationContext中的bean了,暂时也还没了发现如可发起加载bean的过程,继续学习吧。。。

            } catch (ClassNotFoundException var4) {

    .....

                throw new ApplicationContextException("Failed to load default context class [" + contextClassName + "]", var5);

    public WebApplicationContext initWebApplicationContext(ServletContext servletContext) {

    }

    public static final String DEFAULT_CONFIG_LOCATION_PREFIX = "/WEB-INF/";

                if (this.context == null) {

            # 此时就要然后刚现在开始创建 WebApplicationContext 了

                if (ccl == ContextLoader.class.getClassLoader()) {

            .....

   # 文件中不到语录 -> org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext

        } else {

                        #   org.springframework.web.context.WebApplicationContext:${contextPath}

        } catch (IOException var1) {

public class ContextLoaderListener extends ContextLoader implements ServletContextListener {

            try {

        }

                servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);

}

在然后终于是把项目跑起来了,也是踩了不少的坑,把bug还原了一遍又一遍,希望能看的更清楚。现在亲戚亲戚他们都 跳过tomcat再来看看spring是如可启动的。

                    # 亲戚亲戚他们都 假定 this.context 的类型就是 XmlWebApplicationContext

    protected WebApplicationContext createWebApplicationContext(ServletContext sc) {

                if (this.context instanceof ConfigurableWebApplicationContext) {

# 从源码中找到该类,类中的最好的最好的方式全部有的是调用父类来实现的,没了明显的装饰者模式。

            }

        try {

        String contextClassName = servletContext.getInitParameter("contextClass");

            .....

    # 這個 最好的最好的方式大致就是机会web.xml没了配置特殊的contextClass则会使用defaultStrategies中指定的类,也就是顶端静态最好的最好的方式加载到的配置 XmlWebApplicationContext

        currentContextPerThread = new ConcurrentHashMap(1);

    }

            contextClassName = defaultStrategies.getProperty(WebApplicationContext.class.getName());

                return ClassUtils.forName(contextClassName, ClassUtils.getDefaultClassLoader());

            # 简单写成: contextClassName = "org.springframework.web.context.support.XmlWebApplicationContext"

        } else {

            # 机会在web.xml中并未指定contextClass

            try {

                            ApplicationContext parent = this.loadParentContext(servletContext);

                }

            } catch (ClassNotFoundException var5) {

# 再看看ContextLoader這個 类

            try {

        if (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null) {

                            cwac.setParent(parent);

    }

                        # 這個 最好的最好的方式主就是设置contextId,若没了在web.xml中指定,则会像這個 样子:

# 首先亲戚亲戚他们都 在web.xml的配置了没了有有另一个 多lisenner

        }

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

                    ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext)this.context;

                }

                }

       # 将顶端代码简单写成:

                        }

        }

            }

    public static final String DEFAULT_CONFIG_LOCATION = "/WEB-INF/applicationContext.xml";

    .....

}

                        if (cwac.getParent() == null) {

                    }

                            # 很奇怪,loadParentContext返回的是  return null  ??

public class ContextLoader {

                    currentContext = this.context;

            defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);

    }

public class XmlWebApplicationContext extends AbstractRefreshableWebApplicationContext {

                # 這個 才是Lisener的关键,把创建的WebApplicationContext加入到servletContext中。 

                return this.context;

    public static final String DEFAULT_CONFIG_LOCATION_SUFFIX = ".xml";

                    currentContextPerThread.put(ccl, this.context);

   # 這個 静态最好的最好的方式只为加载有有另一个 多ContextLoader.properties文件,没了所料的這個 文件跟类在同有有另一个 多文件夹下。

                    if (!cwac.isActive()) {   # 刚跑起的项目context一般都没被激活

                        this.configureAndRefreshWebApplicationContext(cwac, servletContext);