热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

springboot2.0.3不一样系列之源码篇阶段总结

前言开心一刻朋友喜欢去按摩,第一次推门进来的是一个学生美眉,感觉还不错;后来经常去,有时是护士,有时是空姐,有时候是教师。昨天晚上推门进去的是一个女警察,长得贼好看,身材也很好,朋

前言

  开心一刻

    朋友喜欢去按摩,第一次推门进来的是一个学生美眉,感觉还不错;后来经常去,有时是护士,有时是空姐,有时候是教师。昨天晚上推门进去的是一个女警察,长得贼好看,身材也很好,朋友嗷的一声就扑上去了。然后他就被抓起来了,罪名是:嫖娼、袭警、强奸未遂。

  路漫漫其修远兮,吾将上下而求索!

  github:https://github.com/youzhibing

  码云(gitee):https://gitee.com/youzhibing


前情回顾

  springboot2.3源码篇之SpringApplication的构造方法

    主要做了两件事:

    1、推测应用类型

      根据类路径下是否存在指定类型的类来断定应用类型;

      应用类型有三种:NONE、SERVLET、REACTIVE,NONO表示普通的java应用,SERVLET表示基于servlet 的web工程,REACTIVE表示 reactive web application(还没去了解,囧...)

    2、获取ApplicationContextInitializer、ApplicationListener实例

      查找类路径下全部的META-INF/spring.factories的URL(spring.factories文件的路径),并加载所有spring.factories中的内容(包括各种Initializer、ApplicationListener、AutoConfigure、Failure analyzers等)到SpringFactoriesLoader的cache中;

      然后从缓存中获取ApplicationContextInitializer、ApplicationListener类型的类并进行实例化,然后将得到的实例化集合分别赋值给SpringApplication的initializers和listeners

  springboot2.3源码篇之run方法(一):SpringApplicationRunListener

    主要做了两件事:

    1、准备好运行时监听器:EventPublishingRunListener,并过滤出于与ApplicationStartingEvent匹配的监听器

    2、广播ApplicationStartingEvent事件,触发对应的事件监听器

      LoggingApplicationListener

        检测正在使用的日志系统

      BackgroundPreinitializer

        另起一个后台线程执行耗时的初始化

  springboot2.3源码篇之run方法(二):prepareEnvironment方法

    1、获取或创建环境

      根据SpringApplication构造方法中推断出的应用类型创建对应的环境,一般而言是web环境:StandardServletEnvironment

    2、广播ApplicationEnvironmentPreparedEvent事件,触发相应的监听器

      ConfigFileApplicationListener

        添加名叫random的RandomValuePropertySource到environment

        添加名叫applicationConfig:[classpath:/application.yml]的OriginTrackedMapPropertySource到environment

      LoggingApplicationListener

        初始化日志系统

    3、加载外部化配置的资源到environment

      包括命令行参数、servletConfigInitParams、servletContextInitParams、systemProperties、sytemEnvironment、random、application.yml(.yaml/.xml/.properties)等

  springboot2.3源码篇之run方法(三):createApplicationContext方法

    1、实例化应用上下文

      应用类型有三种,对应的上下文也有三种,NONE -> AnnotationConfigApplicationContext,SERVLET -> AnnotationConfigServletWebServerApplicationContext,REACTIVE -> AnnotationConfigReactiveWebServerApplicationContext;一般而言,创建的是AnnotationConfigServletWebServerApplicationContext。

    2、实例化AnnotatedBeanDefinitionReader、ClassPathBeanDefinitionScanner和DefaultListableBeanFactory

      AnnotatedBeanDefinitionReader是注解bean定义读取器,用于编程式注解bean的注册;ClassPathBeanDefinitionScanner是类路径bean定义扫描器,用于检测类路径上的bean候选者。

      AnnotatedBeanDefinitionReade用来加载class类型的配置,在它初始化的时候,会预先注册一些BeanPostProcessor和BeanFactoryPostProcessor,这些处理器会在接下来的spring初始化流程中被调用。ClassPathBeanDefinitionScanner是一个扫描指定类路径中注解Bean定义的扫描器,在它初始化的时候,会初始化一些需要被扫描的注解。

      DefaultListableBeanFactory,也就是我们所说的beanFactory,用来注册所有bean定义(bean definitions),也可以用来作为单例bean工厂。

  springboot2.3源码篇之run方法(四):prepareContext方法

    1、将SpringApplication中的部分属性应用到上下文中

      SpringApplication中的environment、initializers、listeners应用到spring上下文中

    2、广播ApplicationPreparedEvent事件,触发对应的事件监听器

      向context的beanFactoryPostProcessors中注册了一个PropertySourceOrderingPostProcessor实例
      向beanFactory中注册了一个名叫springBootLoggingSystem的单例bean,也就是我们的日志系统bean

    3、加载资源

      支持4种方式:Class、Resource、Package和CharSequence。

        Class:注解形式的Bean定义;AnnotatedBeanDefinitionReader负责处理。

        Resource:一般而言指的是xml bean配置文件,也就是我们在spring中常用的xml配置。说的简单点就是:将xml的bean定义封装成BeanDefinition并注册到beanFactory的BeanDefinitionMap中;XmlBeanDefinitionReader负责处理。

        Package:以扫包的方式扫描bean定义; ClassPathBeanDefinitionScanner负责处理。

        CharSequence:以先后顺序进行匹配Class、Resource或Package进行加载,谁匹配上了就用谁的处理方式处理。

      springboot鼓励用java类实现java bean定义,所以springboot应用中,我们一般只需要关注Class方式、Package方式即可。

    context中主要是三个属性增加了内容:beanFactory、beanFactoryPostProcessors和applicationListeners


三个事件

  ApplicationStartingEvent

    在监听器注册完、SpringApplication构造完后,以及其他的任何处理之前被广播,触发对应的事件监听器

  ApplicationEnvironmentPreparedEvent

    environment创建后,context创建之前被广播,触发对应的事件监听器
  ApplicationPreparedEvent

    bean定义加载后,上下文refresh之前被广播,触发对应的事件监听器

  后续还会涉及到ApplicationReadyEvent、ApplicationFailedEvent事件,后续再详解

  关于事件机制,可到此处查看更多详情


三个核心

  SpringApplication

    springboot的特性之一,内容如下    

      23. SpringApplication
        23.1. Startup Failure
        23.2. Customizing the Banner
        23.3. Customizing SpringApplication
        23.4. Fluent Builder API
        23.5. Application Events and Listeners
        23.6. Web Environment
        23.7. Accessing Application Arguments
        23.8. Using the ApplicationRunner or CommandLineRunner
        23.9. Application Exit
        23.10. Admin Features

    也是springboot中比较重要的特性之一,用于从java main方法引导和启动Spring应用程序。其实给我印象最深的还是从spring.factories加载一系列的类,包括Initializer、ApplicationListener、AutoConfigure、Failure analyzers等等,springboot的自动配置,从此时已经开始了,一系列的AutoConfigure都是从spring.factories获取的。
  environment:StandardServletEnvironment

    表示当前应用程序所处的环境,主要包括两方面:profiles和properties;例如我们经常说的本地、运测、预发布、生产环境,就可以通过environment进行配置,以及是否是web环境。

    一般而言,我们的环境是StandardServletEnvironment,标准的servlet环境,也就是我们经常说的web环境

  ApplicationContext:AnnotationConfigServletWebServerApplicationContext

    应用上下文,用于为应用程序提供配置的中央接口,提供如下内容:

      1、访问应用程序组件的Bean工厂方法

      2、加载文件资源的能力

      3、发布事件到已注册的事件监听器的能力

      4、解析消息,支持国际化的能力

      等等一系列的功能

    AnnotationConfigServletWebServerApplicationContext是springboot对spring应用上下文的拓展,引入了一些springboot的内容。


推荐阅读
  • 深入解析:React与Webpack配置进阶指南(第二部分)
    在本篇进阶指南的第二部分中,我们将继续探讨 React 与 Webpack 的高级配置技巧。通过实际案例,我们将展示如何使用 React 和 Webpack 构建一个简单的 Todo 应用程序,具体包括 `TodoApp.js` 文件中的代码实现,如导入 React 和自定义组件 `TodoList`。此外,我们还将深入讲解 Webpack 配置文件的优化方法,以提升开发效率和应用性能。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本文详细介绍了在MySQL中如何高效利用EXPLAIN命令进行查询优化。通过实例解析和步骤说明,文章旨在帮助读者深入理解EXPLAIN命令的工作原理及其在性能调优中的应用,内容通俗易懂且结构清晰,适合各水平的数据库管理员和技术人员参考学习。 ... [详细]
  • 如何优化MySQL数据库性能以提升查询效率和系统稳定性 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
  • Vue应用预渲染技术详解与实践 ... [详细]
  • 探究大数据环境下Kafka实现高性能的几个关键因素
    在大数据环境下,Kafka能够实现高性能的关键因素在于其独特的设计和优化策略。尽管Kafka的消息存储在磁盘上,这通常被认为会降低性能,但通过高效的文件管理和批量处理机制,Kafka能够在高吞吐量和低延迟之间取得平衡。此外,Kafka还利用了零拷贝技术、压缩算法和异步IO等手段,进一步提升了系统的整体性能。这些技术不仅保证了数据的可靠性和持久性,还使得Kafka成为处理大规模实时数据流的理想选择。 ... [详细]
  • 本文深入解析了 FCEUX 源码,并详细介绍了两种制作 DEB 包的方法及其技术细节。首先,DEB 包通常由两部分组成:控制信息(位于 DEBIAN 目录)和安装内容(模拟目录)。通过解压现有的 DEB 包,可以查看其内部结构,进而理解其工作原理。具体操作包括将安装内容释放到指定目录中,以便进行进一步的修改和定制。此外,文章还探讨了如何修改现有的 DEB 包,以满足特定需求,提供了实用的步骤和技巧。 ... [详细]
author-avatar
张海英Bs
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有