SpringBoot复习:(13)Banner是怎么打印出来的?

SpringApplication的run方法代码:

复制代码
	public ConfigurableApplicationContext run(String... args) {
		long startTime = System.nanoTime();
		DefaultBootstrapContext bootstrapContext = createBootstrapContext();
		ConfigurableApplicationContext context = null;
		configureHeadlessProperty();
		SpringApplicationRunListeners listeners = getRunListeners(args);
		listeners.starting(bootstrapContext, this.mainApplicationClass);
		try {
			ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
			ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);
			configureIgnoreBeanInfo(environment);
			Banner printedBanner = printBanner(environment);
			context = createApplicationContext();
			context.setApplicationStartup(this.applicationStartup);
			prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
			refreshContext(context);
			afterRefresh(context, applicationArguments);
			Duration timeTakenToStartup = Duration.ofNanos(System.nanoTime() - startTime);
			if (this.logStartupInfo) {
				new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), timeTakenToStartup);
			}
			listeners.started(context, timeTakenToStartup);
			callRunners(context, applicationArguments);
		}
		catch (Throwable ex) {
			handleRunFailure(context, ex, listeners);
			throw new IllegalStateException(ex);
		}
		try {
			Duration timeTakenToReady = Duration.ofNanos(System.nanoTime() - startTime);
			listeners.ready(context, timeTakenToReady);
		}
		catch (Throwable ex) {
			handleRunFailure(context, ex, null);
			throw new IllegalStateException(ex);
		}
		return context;
	}

其中包含如下代码片段:

printBanner的代码如下:

SpringApplication的bannerMode成员变量默认值为CONSOLE,所以会执行

return bannerPrinter.print(environment, this.mainApplicatonClass, System.out);

print方法代码如下:

调用的getBanner代码如下:

其中getImageBanner和getTextBanner分别从约定好的位置读取图片banner和文本banner,如果我们没有配置,则都为null.最后该方法返回默认的banner,也就是DEFAULT_BANNER,该常量为:

也就是返回一个SpringBootBanner。接下来调用banner.printBanner方法:

SpringBootBanner类的printBanner代码如下:

这个printBanner方法最终拼接打印出我们在控制台看到的效果

相关推荐
liu_bees7 分钟前
Jenkins 中修改 admin 账号密码的正确位置与方法
java·运维·tomcat·jenkins
明洞日记16 分钟前
【设计模式手册011】享元模式 - 共享细粒度对象的高效之道
java·设计模式·享元模式
G皮T30 分钟前
【Java】Java 运行时数据区域(一):名词概念
java·jvm·runtime·运行时·运行时数据区域
z***y86242 分钟前
Java数据挖掘开发
java·开发语言·数据挖掘
鱼锦0.01 小时前
基于spring+vue把图片文件上传至阿里云oss容器并回显
java·vue.js·spring
從南走到北1 小时前
JAVA国际版同城跑腿源码快递代取帮买帮送同城服务源码支持Android+IOS+H5
android·java·ios·微信小程序
q***09801 小时前
Spring Boot 2.7.x 至 2.7.18 及更旧的版本,漏洞说明
java·spring boot·后端
程序员爱钓鱼1 小时前
Python 编程实战 · 进阶与职业发展:数据分析与 AI(Pandas、NumPy、Scikit-learn)
后端·python·trae
q***14641 小时前
oracle 12c查看执行过的sql及当前正在执行的sql
java·sql·oracle
程序员爱钓鱼1 小时前
Python 编程实战 · 进阶与职业发展:Web 全栈(Django / FastAPI)
后端·python·trae