SpringBoot Banner
lhf2112 人气:0Banner的设置方式有以下几种
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打印到控制台上。
加载全部内容