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

springboot获取datasource为null_SpringBoot运行源码分析:Spring应用上下文创建

忽略信息配置经过以上步骤,ConfigurableEnvironment的初始化和准备工作已经完成。之后,程序又对环境中的忽略信息配置项“spring.

忽略信息配置

经过以上步骤,ConfigurableEnvironment 的初 始化和准备工作已经完成。之后,程序又对环境中的忽略信息配置项“spring.beaninfo.ignore”的值进行获取判断,进而设置为系统参数中的忽略项。

private void configureIgnoreBeanInfo(ConfigurableEnvironment environment) {//如果系统参数中 spring. beaninfo. ignore 为 nullif (System. getProperty(CachedIntrospect ionResults . IGNORE_ BEANINFO_ PROPERTY_ NAME) == null) {//获取环境中 spring. beaninfo. ignore 的配置Boolean ignore = environment . getProperty("spring . beaninfo. ignore",Boolean. class, Boolean.TRUE);//设置对应的系统参数System. setProperty( CachedIntrospectionResults . IGNORE_ BEANINFO_ PROPERTYNAME,ignore.toString());}

spring.beaninfo.ignore 的配置用来决定是否跳过 BeanInfo 类的扫描,如果设置为 true,则跳过。

fa3f62f32c5396fb3f5898151fd8574a.png

打印 Banner

完成环境的基本处理之后,下面就是控制台 Banner 的打印了。SpringBoot 的 Banner 打印是一个比较酷炫的功能,但又显得有些华而不实,特别是打印图片时启动速度会变慢。这里,我们简单了解一下它的底层代码实现。

Banner 打印是通过 printBanner 方法完成的,相关代码如下。

private Banner printBanner(ConfigurableEnvironment environment) { Q//如果处于关闭状态,则返回 nullif (this . bannerMode == Banner . Mode .0FF) {return null;//如果 resourceL oader 不存在则创建一个默认的 ResourceL oaderResourceL oader resourcel oader(this. resourceLoader != null)? this .resourceLoader : new DefaultResourcel oader(getClassLoader());//构建 SpringAppl icat ionBannerPrinterSpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter(resourceLoader, this. banner);//打印到日志中if (this . bannerMode == Mode.L0G) {return bannerPr inter . print(environment, this 。mainAppl icationClass, logger);//打印到控制台return bannerPrinter .print(environment, this .mainApplicationClass, System. out);}

上面的代码中展示了 Banner 的开启及打印位置的设置。 程序通过 Banner.Mode 枚举值来判 断 是 否 开 启 Banner 打 印 , 此 项 参 数 可 以 在 SpringBoot 入 口 main 方 法 中 通 过setBannerMode 方 法 来 设 置 , 也可 以 通 过 application.properties 中 的spring.main.banner-mode 进行设置。

SpringApplicationBannerPrinter 类承载了 Banner 初始化及打印的核心功能,比如默认如何获取 Banner 信息、如何根据约定优于配置来默认获得 Banner 的内容、Banner 支持的文件格式等。

而 具 体 打 印 的 信 息 是 由 Banner 接 口 的 实 现 类 来 完 成 的 , 比 如 默 认 情 况 下 使 用

SpringBootBanner 来打印 Spring Boot 的版本信息及简单的图形。当然还有通过资源文件打印的 ResourceBanner,通过图片打印的 ImageBanner 等方法。

由于该功能华而不实,就不贴代码占用过多篇幅了,感兴趣的朋友可自行查阅源代码。

6a93f5db7a09f3890087696a23ecdf08.png

Spring应用上下文的创建

在前面的章节中已经多次涉及 WebApplicationType 枚举类,无论是推断 Web 应用类型,还是创建不同的配置环境都与此枚举类有关。Sprina Boot 创建 Spring 的应用上下文时,如果未指定要创建的类,则会根据之前推断出的类型来进行默认上下文类的创建。

在 Spring Boot 中通过 SpringApplication 类中的 createApplicationContext 来进行应用上下文的创建,代码如下。

public static final String DEFAULT_ CONTEXT_ CLASS = "org. springframeworkgontext."+ "annotation. Annotat ionConfigApplicationContext";public static final String DEFAULT_ SERVLET_ WEB_ _CONTEXT_ CLASS = "org.springfr amework .boot.""web. servlet. context . AnnotationConfigServletWebServerApplicationContext"public static final String DEFAULT REACTIVE_ WEB_ CONTEXT_ CLASS = "org.springframework .+"boot .web.reactive. context .AnnotationConfigReactiveWebServerApplicationContext";protected ConfigurableApplicat ionContext createApplicationContext() {/首先获取容器的类变量Class> contextClass = this. applicationContextClass;//如果为 null,则根据 Web 应用类型按照默认类进行创建if (contextClass == null) {tryswitch (this .webApplicat ionType)caseSERVLET:contextClassClass. forName (DEFAULT_ SERVLET_ WEB_ CONTEXT_ _CLASS);break;ase REACTIVE:contextClass = Class . forName (DEFAULT_ REACTIVE_ WEB_ _CONTEXT _CLASS);break;default:contextClass = Class. forName(DEFAULT_ _CONTEXT_ _CLASS);catch (ClassNotFoundException ex) {/异常处理//如果存在对应的 Class 配置,则通过 Spring 提供的 BeanUtils 来进行实例化return (Conf igurableApplicat ionContext) BeanUtils . instantiateClass(contextClass);}

那么,在 createApplicationContext 方法中,什么时候 applicationContextClass 变量不为null 呢? 比如,当我们 创建 SpringApplication 之后,在调用 run 方法之前,调 用其setApplicationContextClass 方法指定了 ConfigurableApplicationContext 的设置。但需要注意 的 是 , 该 方 法 不 仅 设 置 了 applicationContextClass 的 值 , 同 时 也 设 置 了webApplicationType 的值,需慎用。

可以看出 createApplicationContext 方法中核心操作就是根据枚举类型进行判断,创建不同的上下文容器,前面已经多次讲到类似的操作,就不再赘述了。

10a52d9e4679aa5f1038bca7bac4f617.png

本文给大家讲解的内容是忽略信息配置、打印Banner、Spring应用上下文的创建
  1. 下篇文章给大家讲解的是Spring应用上下文的准备;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!



推荐阅读
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
author-avatar
卡哇伊--欣欣_749
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有