`

从源码学spring一启动

阅读更多
       Jetty在启动时,先启动Server,调用jettyserver的父类 HandlerWrapper的dostart方法,启动handler,handler是一个HandlerWrapper,总共包含8个Handler,循环调用Handler的start方法,启动各个Handler。
        其中XX,负责解析webapp的基本信息,解析web.xml,并将信息保存到实体中。然后调用WebAppContext doStart 启动,  记载和调用在web.xml中解析并已经加载的所有Listener的contextInitialized 方法,启动listener。 
       本文分析的主要包括:webapp的解析和启动、请求的处理、权限的管理、jsp的解析。
(一)webapp的解析和启动包括:
  1.     webapp的解析和启动
  2.     Spring的启动和Bean的加载等
(二)请求的处理包括:
  1.     jetty如何处理请求,并转发到spring 
  2.     spring如何处理请求
(三)权限的管理包括:
  1.    jetty如何管理cookies和session
  2.    spring security如何管理权限
(四)jsp的解析
  1.    jsp如何转化为servlet
  2.    各个模板引擎是如何工作的
 

一、webapp的解析和启动

 
 服务启动时调用server的dostart方法,dostart方法调用父类HandlerWrapper的dostart方法,dostart方法启动Handler的,这个Handler是一个HandlerCollection,包含三个元素,循环启动三个Handler。
  1.  0 = {ContextHandlerCollection@3593} 
  2.  1 = {DefaultHandler@3633} 
  3.  2 = {RequestLogHandler@3634} 
        其中ContextHandlerCollection是部署的app,webapp目录下面有多少个war,就有多少个JettyWebAppContext元素,循环调用JettyWebAppContext的start方法启动app的部署和解析。

1、web.xml的解析    

     JettyWebAppContext 的类层次结构如下:
    JettyWebAppContext > WebAppContext > ServletContextHandler > ContextHandler > ScopeHandler > HandlerWrapper > AbstractHandlerContainer > AbstractHandler > AggregateLifeCycle >  AbstractLifeCycle 
 
protected void doStart() throws Exception {
        try {
            this._metadata.setAllowDuplicateFragmentNames(this.isAllowDuplicateFragmentNames());
            this.preConfigure();
            super.doStart();
            this.postConfigure();
            if(this.isLogUrlOnStart()) {
                this.dumpUrl();
            }
        } catch (Exception var2) {
            LOG.warn("Failed startup of context " + this, var2);
            this._unavailableException = var2;
            this.setAvailable(false);
            if(this.isThrowUnavailableOnStartupException()) {
                throw var2;
            }
        }
    }
 
dostart方法的调用堆栈如下:
at org.eclipse.jetty.webapp.StandardDescriptorProcessor.visitSessionConfig(StandardDescriptorProcessor.java:667)
at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.eclipse.jetty.webapp.IterativeDescriptorProcessor.visit(IterativeDescriptorProcessor.java:85)
at org.eclipse.jetty.webapp.IterativeDescriptorProcessor.process(IterativeDescriptorProcessor.java:72)
at org.eclipse.jetty.webapp.MetaData.resolve(MetaData.java:366)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1240) ContextHandler的startContext方法
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:717)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:494)
at org.mortbay.jetty.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:298) 
 
其中_configurations 包含如下:
0 = {MavenWebInfConfiguration@3811}
1 = {WebXmlConfiguration@3812}
2 = {MetaInfConfiguration@3813}
3 = {FragmentConfiguration@3814}
4 = {EnvConfiguration@3675}
5 = {PlusConfiguration@3815}
6 = {MavenAnnotationConfiguration@3816}
7 = {JettyWebXmlConfiguration@3817}
 
MavenWebInfConfiguration主要处理webinf目录和一些临时目录等相关的配置。
WebXmlConfiguration负责定位和解析web.xml配置文件。
MetaInfConfiguration负责解析jar包。
 
org.eclipse.jetty.webapp.WebAppContext.startContext最后负责启动所有的Listener,如果使用了Spring框架,此时会启动Spring的ContextLoaderListener。
0 = {ELContextCleaner@5759}
1 = {IntrospectorCleaner@5760}
2 = {LogbackConfigListener@5761}
3 = {SystemLoaderListener@5762}
4 = {OnlineInfoListener@5763}
 
在WebAppContext的启动过程中启动了SessionHandler。
at org.eclipse.jetty.server.session.HashSessionManager.doStart(HashSessionManager.java:92)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
- locked <0x12c1> (a java.lang.Object)
at org.eclipse.jetty.server.session.SessionHandler.doStart(SessionHandler.java:123)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
- locked <0x1287> (a java.lang.Object)
at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:95)
at org.eclipse.jetty.server.handler.ScopedHandler.doStart(ScopedHandler.java:115)
at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:763)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:249)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1242)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:717)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:494)
 
 

2、Spring的启动

 
第一步解析并把bean的定义加载到集合中,此时不会初始化bean,因为bean可能存在以来关系。
第二步分析bean的依赖关系.
第三步创建并加载bean
bean的解析和加载是一个递归的过程。
 
如果是XML的context配置,通过web.xml配置文件找到Spring的初始配置文件,并解析。包括外部文件、component-scan、bean的创建、资源的映射等的处理。
其中parseDefaultElement方法根据不同的类型进行不同的处理。

 

 
分享到:
评论

相关推荐

    spring实战全部源代码.zip

    《Spring实战》第五版的源代码压缩包"spring实战全部源代码.zip"包含了全面的示例项目,旨在帮助读者深入理解和应用Spring框架。这个压缩包中的"spring-in-action-5-samples-master"目录揭示了书中的各个实战案例,...

    spring学习事务源码

    在源码分析中,我们可以看到当一个方法被@Transactional标记后,Spring会创建一个代理,这个代理在目标方法执行前后插入事务管理逻辑。在方法开始前,如果满足事务启动条件,就会调用`PlatformTransactionManager`的...

    82. Spring Boot – 启动彩蛋【从零开始学Spring Boot】

    Spring Boot – 启动彩蛋"这一主题,这属于Spring Boot框架的一部分,该框架简化了Java应用程序的创建和管理。启动彩蛋是开发人员为了增加趣味性或者隐藏信息而在软件中设置的小秘密,通常需要特定的触发条件才能...

    spring 源码中文注释

    这份"spring 源码中文注释"包含了对Spring框架源码的详细解读,对于理解其工作原理、优化代码以及定制化开发具有重要意义。 首先,我们来看看Spring的核心组件——IoC容器。IoC容器是Spring的核心,它负责管理对象...

    SpringiA4_SourceCode:Spring实战第四版源码,学习用。

    《Spring实战第四版》是Java开发领域中一本深入讲解Spring框架的经典著作,源代码的提供为读者提供了亲自动手实践的机会,有助于加深理解和应用。在这个压缩包中,包含的文件名为"spring4源码_Code4",我们可以推测...

    精通spring 源代码

    《精通Spring源代码》是罗时飞先生关于Spring框架深入解析的一部著作,旨在帮助开发者更深入地理解Spring的工作原理,提升对Java企业级应用开发的掌控能力。本压缩包包含的文件名为“精通Spring源码”,这通常是一个...

    Spring In Action 4 源代码

    《Spring in Action 4》是一本深入探讨Spring框架的经典书籍,其源代码是学习和理解Spring框架核心概念、工作原理及应用实践的重要资源。这里,我们主要围绕Spring框架的源代码进行详细的分析和讨论。 首先,Spring...

    Spring Boot源码(spring-boot-2.6.2.zip)

    通过阅读这些核心组件的源码,我们可以深入理解Spring Boot是如何加载配置、启动应用、自动配置bean以及与其他Spring框架组件协作的。这将有助于提升我们的开发技能,解决潜在的问题,并且更好地优化Spring Boot应用...

    Spring 入门教程资料(源码源代码及课程笔记)

    这些通常代表了不同时间或主题的课程内容,可能包括课件、笔记、源代码示例等。以下是一些可能涵盖的重要知识点: 1. **依赖注入(Dependency Injection, DI)**:这是 Spring 最基础也最重要的特性,通过它,我们...

    spring源代码

    源代码分析有助于深入理解Spring的工作原理,提升编程技能,并且能够帮助开发者在遇到问题时进行调试和优化。 1. **Spring IoC容器**: Spring的核心是IoC容器,它负责管理对象的生命周期和依赖关系。通过XML配置...

    SpringSecurity源码

    在学习SpringSecurity源码时,建议从以下几个方面入手: 1. **源码结构分析**:了解主要组件的类结构和它们之间的关系,如`Authentication`、`Authorization`、`FilterChainProxy`等。 2. **关键类的实现**:深入...

    跟我学spring3

    "跟我学spring3-源码.rar"包含了示例代码,方便读者实践操作,"更多电子书.url"和"PDF阅读器下载.url"则是其他资源的链接,可以帮助你在学习过程中获取更多相关资料。 总的来说,《跟我学Spring3》是一本全面而实用...

    Spring入门经典源代码

    6. **Spring Boot**:如果源代码包含Spring Boot的相关内容,那么这是一个现代的快速启动框架,它简化了Spring应用的配置,通常与Spring Cloud一起使用,实现微服务架构。 7. **Spring Security**:如果涉及到安全...

    达内java培训SPRING 源代码

    7. **Spring Boot**:虽然不在提供的源代码列表中,但Spring Boot是近年来流行的Spring项目初始化工具,它简化了Spring应用的创建和配置,通常用于快速启动新项目。 8. **Spring Security**:Spring Security是一个...

    Spring最新源代码

    Spring框架是中国IT开发者广泛使用的Java企业级应用开发框架,它为构建高质量、可维护和可扩展的Java...通过研究Spring的源代码,你可以更深入地理解其工作原理,从而更好地利用这个强大的工具来构建高效的企业级应用。

    Spring学习笔记&源码

    1. **简单应用示例**:展示一个基础的Spring配置,如何启动Spring容器并运行一个简单的Hello World程序。 2. **IoC实践**:包含各种Bean的定义和注入方式的代码实例,比如单例、原型、工厂bean等。 3. **AOP示例**...

    SpringCloud项目源码下载.docx

    尽管文档标题和描述较为简单,但可以从这些信息中提炼出关于Spring Cloud项目的源码下载、Spring Cloud的基本概念、用途及其核心组件等方面的内容。 ### Spring Cloud 概念 Spring Cloud 是一个基于Spring Boot...

    Spring in Action 第四版英文原版+源码

    总之,《Spring in Action》第四版结合其源码,为Java开发者提供了一个全面学习和实践Spring框架的平台,无论你是初学者还是经验丰富的开发者,都能从中受益匪浅。通过深入阅读和实践,你可以提升自己的技能,更好地...

    1. [视频]spring boot起步之Hello World【从零开始学Spring Boot】

    在本节中,我们将深入探讨"Spring Boot起步之Hello World"这一主题,这是学习Spring Boot框架的典型入门教程。Spring Boot是由Pivotal团队开发的一个框架,它旨在简化Spring应用程序的初始搭建以及开发过程,通过...

    java maven工程 spring boot 学习源码

    - src/main/java:源代码目录,包含主类和其他业务逻辑代码。 - src/main/resources:资源文件夹,可能有application.properties或application.yml,这是Spring Boot的应用配置文件。 - src/test/java:测试代码目录...

Global site tag (gtag.js) - Google Analytics