SpringBoot启动流程分析之设置系统属性spring.beaninfo.ignore、自定义banner图(五)

SpringBoot启动流程分析之设置系统属性spring.beaninfo.ignore、自定义banner图(五)

参考
目录

文章目录

      • SpringBoot启动流程分析之设置系统属性spring.beaninfo.ignore、自定义banner图(五)
          • 1、设置sping.beaninfo.ignore属性
          • 2、Banner图
            • 2.1、输出banner图
          • 3、自定义banner图

org.springframework.boot.SpringApplication#run(java.lang.String…)

public ConfigurableApplicationContext run(String... args) {
		StopWatch stopWatch = new StopWatch();
		stopWatch.start();
		ConfigurableApplicationContext context = null;
		Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
		configureHeadlessProperty();
		SpringApplicationRunListeners listeners = getRunListeners(args);
		listeners.starting();
		try {
			// 开始分析 
           //得到系统属性spring.beaninfo.ignore,如果为空设置为true
			configureIgnoreBeanInfo(environment);
			Banner printedBanner = printBanner(environment);
			//其余部分忽略...
		}
		catch (Throwable ex) {
			handleRunFailure(context, ex, exceptionReporters, listeners);
			throw new IllegalStateException(ex);
		}

		return context;
	}

流程分析

1、设置sping.beaninfo.ignore属性
private void configureIgnoreBeanInfo(ConfigurableEnvironment environment) {            
        //得到系统属性spring.beaninfo.ignore,如果为空设置为true
	if (System.getProperty(
			CachedIntrospectionResults.IGNORE_BEANINFO_PROPERTY_NAME) == null) {
		Boolean ignore = environment.getProperty("spring.beaninfo.ignore",
				Boolean.class, Boolean.TRUE);
		System.setProperty(CachedIntrospectionResults.IGNORE_BEANINFO_PROPERTY_NAME,
				ignore.toString());
	}
}
2、Banner图
private Banner printBanner(ConfigurableEnvironment environment) {
        //判断banner图输出模式,off为不输出,直接返回空
	if (this.bannerMode == Banner.Mode.OFF) {
		return null;
	}
        //得到resourceLoader
	ResourceLoader resourceLoader = (this.resourceLoader != null)
			? this.resourceLoader : new DefaultResourceLoader(getClassLoader());
        //实例化一个SpringApplicationBannerPrinter
	SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter(
			resourceLoader, this.banner);
        //判断banner是否输出到日志文件
	if (this.bannerMode == Mode.LOG) {
		return bannerPrinter.print(environment, this.mainApplicationClass, logger);
	}
        //最后就是输出到控制台了,参数包括environment,主类,一个打印流System.out
	return bannerPrinter.print(environment, this.mainApplicationClass, System.out);
}

Banner图的打印模式枚举值:

Mode.OFF :不输出
Mode.CONSOLE:将输出到System.out,即控制台
Mode.log:输出到日志文件
可以通过SpringApplication对象设置打印模式。设置为OFF,即不输出Banner,启动后效果如下。

@SpringBootApplication
public class Application {
	public static void main(String[] args) {
//		SpringApplication.run(Application.class, args);
		
		SpringApplication application = new SpringApplication(Application.class);
		application.setBannerMode(Mode.OFF);
		ConfigurableApplicationContext context = application.run(args);
 
		context.close();
	}
}

在这里插入图片描述

2.1、输出banner图

new一个Banners对象,该对象内部有一个Banner对象的集合,下一步就是得到文本或者图片banner,然后添加到list中,不为空则返回该对象。在Banners的printBanner方法中循环调用对应ResourceBanner和ImageBanner的printBanner方法。

public Banner print(Environment environment, Class<?> sourceClass, PrintStream out) {
	Banner banner = getBanner(environment);
        //输出banner图
	banner.printBanner(environment, sourceClass, out);
	return new PrintedBanner(banner, sourceClass);
}
 
private Banner getBanner(Environment environment) {
	Banners banners = new Banners();
        //得到图片banner,如果不为空就添加到List集合中
	banners.addIfNotNull(getImageBanner(environment));
        //得到txt文本banner,同样不为空就添加到List集合中
	banners.addIfNotNull(getTextBanner(environment));
        //r如果List不为空,直接返回
	if (banners.hasAtLeastOneBanner()) {
		return banners;
	}
        //如果该banner对象不为空,返回该banner对象
	if (this.fallbackBanner != null) {
		return this.fallbackBanner;
	}
        //最后就是返回默认banner图,也就是我们看到的spring
	return DEFAULT_BANNER;
}

可以看到banner的配置项,默认位置,默认的txt文件名和支持的banner图片类型,图片名字也是banner加上后缀。如果存在txt文档,返回的就是ResourceBanner,存在图片banner返回的就是ImageBanner,如果不存在都是返回空,则使用默认的SpringBootBanner。也就是启动后看见的那个大大的Spring。
在这里插入图片描述

private Banner getBanner(Environment environment) {
		Banners banners = new Banners();
		banners.addIfNotNull(getImageBanner(environment));
		banners.addIfNotNull(getTextBanner(environment));
		if (banners.hasAtLeastOneBanner()) {
			return banners;
		}
		if (this.fallbackBanner != null) {
			return this.fallbackBanner;
		}
		return DEFAULT_BANNER;
	}

	private Banner getTextBanner(Environment environment) {
		String location = environment.getProperty(BANNER_LOCATION_PROPERTY, DEFAULT_BANNER_LOCATION);
		Resource resource = this.resourceLoader.getResource(location);
		if (resource.exists()) {
			return new ResourceBanner(resource);
		}
		return null;
	}

	private Banner getImageBanner(Environment environment) {
		String location = environment.getProperty(BANNER_IMAGE_LOCATION_PROPERTY);
		if (StringUtils.hasLength(location)) {
			Resource resource = this.resourceLoader.getResource(location);
			return resource.exists() ? new ImageBanner(resource) : null;
		}
		for (String ext : IMAGE_EXTENSION) {
			Resource resource = this.resourceLoader.getResource("banner." + ext);
			if (resource.exists()) {
				return new ImageBanner(resource);
			}
		}
		return null;
	}

最后就是输出banner图了,System.out.println();
在这里插入图片描述

3、自定义banner图

在resources目录下新建一个banner.txt文件或者你也可以直接放一张图片到resources目录下,名字是banner.jpg(gif|png)。我的banner.txt内容如下。

可以到这个网站去生成banner图:生成banner图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/676469.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文带你搞懂单模光纤和多模光纤的区别

单模光纤和多模光纤的区别及常见疑问解答 随着网络技术的飞跃&#xff0c;光纤因其高速传输与大容量特性&#xff0c;成为通信领域的佼佼者。光纤主要分为单模与多模&#xff0c;两者在几何与传输特性上迥异&#xff0c;实际应用中表现显著不同。本文将深入剖析两者的差异与应用…

记一次黑群晖折腾的过程

Tips&#xff1a; 建议先完整看完这篇文章&#xff0c;理解大致流程后再上手操作&#xff0c;其中有一些注意点需要事先了解 安装黑群晖的教程网上很多&#xff0c;我是参考了这篇&#xff1a; https://post.smzdm.com/p/am3epen4/前言在上一盘文章中组装了一台黑群晖&#…

Docker基础篇之将本地镜像发布到私有库

文章目录 1. Docker Registry简介2. 将本地镜像推送到私有库 1. Docker Registry简介 Docker Registry是官方提供的工具&#xff0c;可以用于构建私有镜像仓库。 2. 将本地镜像推送到私有库 下载Docker Registry docker pull registry现在我们可以从镜像中看到下载的Regist…

数据持久化第七课-URL重写与Ajax

数据持久化第七课-URL重写与Ajax 一.预习笔记 1.URL重写(对网页地址进行保护) 首先编写module,实现对网络地址的处理 其次就是module的配置 最后验证url重写技术 2.Ajax数据交互 编写后端响应数据 处理跨域的配置问题 运行项目得到后端响应数据的地址 编写前端ajax进行数据请…

基于VGG16的猫狗数据集分类

目录 1. 作者介绍2. VGG16介绍2.1 背景介绍2.2 VGG16 结构 3. Cat VS Dog数据集介绍4. 实验过程4.1 数据集处理4.2 训练部分设置4.3 训练结果4.4 问题分析4.5 单张图片测试 5.完整训练代码与权重参考文献 1. 作者介绍 孙思伟&#xff0c;男&#xff0c;西安工程大学电子信息学…

Accelerate 笔记:保存与加载文件

保存和加载模型、优化器、随机数生成器和 GradScaler 使用 save_state() 将上述所有内容保存到一个文件夹位置使用 load_state() 加载之前通过 save_state() 保存的状态通过使用 register_for_checkpointing()&#xff0c;可以注册自定义对象以便自动从前两个函数中存储或加载 …

epoll源码分析

epoll源码分析 主要数据结构epoll_create()函数实现ep_alloc()&#xff1a;初始化结构初始化eventpoll epoll_ctl()函数实现ep_insert回调函数的实现ep_ptable_queue_proc函数ep_poll_callback epoll_wait函数SYSCALL_DEFINE4(epoll_wait, ...)ep_pollep_send_events 主要数据结…

百度/迅雷/夸克,网盘免费加速,已破!

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 之前给大家安利了百度网盘及迅雷的加速方法&#xff0c;详细方法及获取参考之前文章&#xff1a; 刚刚&#xff01;度盘、某雷已破&#xff01;速度50M/s&#xff01; 本次主要介绍夸…

基于DeepLabv3+实现图像分割

目录 1. 作者介绍2. DeepLabv3算法2.1 DeepLabv3算法介绍2.2 DeepLabv3模型结构 3. 实验过程基于DeepLabv3实现图像分割3.1 VOC数据集介绍3.2 代码实现3.3 问题分析 4. 参考连接 1. 作者介绍 吴天禧&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2023级研究…

派派派森02

目录 1.容器 1.列表 2.元组 3.字符串 3.序列 4.集合 5.字典 2.数据容器通用操作 • max最大元素 • min最小元素 • 容器的通用转换功能 • 通用排序功能 3.字符串大小比较 4.函数中多个返回值 5.函数参数多种传递方式 1.位置参数 2.关键字参数 3.缺省参数 …

(函数)判断字符串元音字母(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明判断元音函数&#xff1b; void vowel(char a[100], char b[100]);int main() {//初始化变量值&#xff1b;char a[100] { 0 };char b[100] { 0 };//获取…

Python 图书馆管理系统 有GUI界面 【含Python源码 MX_031期】

使用python3&#xff0c;PyQt5&#xff0c;Sqlite3数据库搭建 数据库版本为MySQL&#xff1a;Python 图书馆管理系统&#xff08;MySQL数据库&#xff09; 有GUI界面 【含Python源码 MX_032期】-CSDN博客 主要功能&#xff1a; 用户注册、登录、修改密码、用户管理存储图书信…

Springboot校园美食推荐系统的开发-计算机毕业设计源码44555

摘要 随着人们生活水平的提高&#xff0c;人们对美食的要求也越来越高&#xff0c;对各类美食信息需求越来越大。因此&#xff0c;结合计算机快速发展、普及&#xff0c;在此基础上制作一个页面简单、美观,功能实用的校园美食推荐系统势在必行&#xff0c;满足用户分享美食的需…

【科学文献计量】使用Endnote软件打开中国知网导出的文献期刊解析不正确问题解决

使用Endnote软件打开中国知网导出的文献期刊解析不正确问题解决 问题解决问题 新建一个Endnote的材料库,然后把下载好的中国知网文献数据(知网数据导出的是Endnote格式样式)导入进来。找到文件所在路径,导入的类型选择是“Endnote import”,然后点击确定,界面结果如下 …

【Web API DOM04】事件类型、对象、解绑

一&#xff1a;事件类型 1 鼠标事件 常见鼠标事件 鼠标点击事件&#xff1a;’click‘ 鼠标移入事件&#xff1a;‘mouseenter’ 鼠标离开事件&#xff1a;‘mouseleave’ 鼠标经过事件区别 mouseover和mouseout会有冒泡效果 mouvseenter和mouseleave没有冒泡效果 2 焦…

有哪些挣钱软件一天能赚几十元?盘点十个能长期做下去的挣钱软件

在这个信息爆炸的时代&#xff0c;每个人都在寻找快速赚钱的秘诀。很多人做兼职副业的目标并不是获得很大的成功&#xff0c;大部分人一天能赚几十就心满意足了。 今天&#xff0c;我要带你一探究竟&#xff0c;揭秘那些能让你日赚几十元的挣钱软件。准备好了吗&#xff1f;让我…

vue3+typescript 使用Codemirror

安装 // npm npm install codemirror-editor-vue3 codemirror^5.65.12// ts版 还需安装&#xff1a; npm install types/codemirror全局注册 修改main.ts&#xff1a; import { createApp } from vueimport App from ./App.vueimport { InstallCodemirro } from "code…

面向对象程序设计之从C到C++的初步了解

1. C语言 1. C的发展 C是从C语言发展演变而来的&#xff0c;首先是一个更好的C引入了类的机制&#xff0c;最初的C被称为“带类的C”1983年正式取名为C 从1989年开始C语言的标准化工作 于1994年制定了ANSIC标准草案 于1998年11月被国际标准化组织(ISO)批准为国际标准&#xf…

数据结构与算法06-树结构(二叉树)

介绍 树也是基于结点的数据结构&#xff0c;但树里面的每个结点&#xff0c;可以含有多个链分别指向其他多个结点。 基于树的数据结构有很多种&#xff0c;但本章只关注其中一种——二叉树。二叉树是一种遵守以下规则的树。 每个结点的子结点数量可为 0、1、2。如果有两个子…

码蹄杯 2024 初赛第一场

MC0301 求个最大值 code: #include<bits/stdc.h> #define int long long #define endl \nusing namespace std;int n;void solve(){cin >> n;int mx -1;for(int i 0;i < n;i ){int x; cin >> x;mx max(mx,x);}cout << mx << endl; }sig…