亲宝软件园·资讯

展开

SpringBoot Banner

lhf2112 人气:0

Banner的设置方式有以下几种

1、默认:SpringBoot + 版本号;

2、添加自定义资源文件:banner.txt;

3、添加自定义资源文件:banner.jpg/png/gif;

4、SpringApplication的setBanner方法,自定义资源;

下面我们进入源码,SpringBoot如何实现banner的加载:

进入SpringApplication的run方法,可以看到如下的一行内容:

Banner printedBanner = printBanner(environment);

这个就是获取banner的入口,我们来跟进下这个方法:

	private Banner printBanner(ConfigurableEnvironment environment) {
		if (this.bannerMode == Banner.Mode.OFF) {
			return null;
		}
		ResourceLoader resourceLoader = (this.resourceLoader != null) ? this.resourceLoader
				: new DefaultResourceLoader(getClassLoader());
		SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter(resourceLoader, this.banner);
		if (this.bannerMode == Mode.LOG) {
			return bannerPrinter.print(environment, this.mainApplicationClass, logger);
		}
		return bannerPrinter.print(environment, this.mainApplicationClass, System.out);
	

代码首先检验是否关闭了banner(可以通过spring.main.banner-mode=off来配置),Banner.Mode的取值方式有三种,包括OFF、CONSOLE(控制台,默认)以及LOG(日志)。如果是关闭状态,那么直接返回空。

接下来程序会根据模式是CONSOLE或是LOG来分别进行处理。处理过程比较相似,我们先看LOG方式打印的方法:

	Banner print(Environment environment, Class<?> sourceClass, Log logger) {
		Banner banner = getBanner(environment);
		try {
			logger.info(createStringFromBanner(banner, environment, sourceClass));
		}
		catch (UnsupportedEncodingException ex) {
			logger.warn("Failed to create String for banner", ex);
		}
		return new PrintedBanner(banner, sourceClass);
	}

我们重点先关注getBanner方法:

	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;
	}

getBanner方法首先会尝试通过getImageBanner加载图片的banner,从配置文件的"spring.banner.image.location"配置项来拼接后缀gif、jpg、png,读取相应的文件,返回一个ImageBanner对象,添加到banners;

如果没有图片的banner,则会通过getTextBanner方法获取txt,从配置文件的"spring.banner.location"获取配置项,默认为banner.txt,读取文件,返回ResourceBanner对象,添加到banners;

这时如果banners还是空的,说明没有ImageBanner和ResourceBanner被配置,但是有手动设置的fallbackBanner,那么就会返回它,fallbackBanner就是通过setBanner方法加入的banner。否则就返回不含有自定义信息的,系统默认banner。

LOG方式下,会调用logger来进行info级别的日志输出。

而CONSOLE方式的情况下,方法如下:

	Banner print(Environment environment, Class<?> sourceClass, PrintStream out) {
		Banner banner = getBanner(environment);
		banner.printBanner(environment, sourceClass, out);
		return new PrintedBanner(banner, sourceClass);
	}

这里的getBanner方法和LOG方式是一样的,在这就不再赘述了。与LOG方式不同的是,这种方式是通过System.out标准输出流,将banner打印到控制台上。

加载全部内容

相关教程
猜你喜欢
用户评论