SpringApplication
一般,我们用 SpringApplication 来启动 spring boot 应用。如
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
还有其他两种方式:
自定义 SpringApplication:
SpringApplication app = new SpringApplication(MySpringConfiguration.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
使用 Builder:
new SpringApplicationBuilder()
.sources(Parent.class)
.child(Application.class)
.bannerMode(Banner.Mode.OFF)
.run(args);
自定义 banner
自定义文本
在 resources 目录下添加 banner.txt 文件:
Test
${AnsiColor.YELLOW}
Test Banner Text
Application Version: ${application.version}${application.formatted-version}
Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}
启动应用时,显示如下:
Test
Test Banner Text
Application Version:
Spring Boot Version: 2.1.3.RELEASE (v2.1.3.RELEASE)
自定义 banner 图:
在 resources 目录下添加 banner.png 文件启动应用时显示:
@@@*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@*@&@*@@@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@:*@@#@@@@@@@*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@#@@&@@*@@*@:@o@@@@:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Test
Test Banner Text
Application Version:
Spring Boot Version: 2.1.3.RELEASE (v2.1.3.RELEASE)
以上的 @ 行,其实是图片 banner.png 的字符信息。
接下来看一下实现逻辑, 搜索 banner.txt:
class SpringApplicationBannerPrinter {
static final String BANNER_LOCATION_PROPERTY = “spring.banner.location”;
static final String BANNER_IMAGE_LOCATION_PROPERTY = “spring.banner.image.location”;
static final String DEFAULT_BANNER_LOCATION = “banner.txt”;
static final String[] IMAGE_EXTENSION = { “gif”, “jpg”, “png”};
private Banner getBanner(Environment environment) {
Banners banners = new Banners();
// 先添加图片 banner
banners.addIfNotNull(getImageBanner(environment));
// 再添加文本信息的 banner
banners.addIfNotNull(getTextBanner(environment));
if (banners.hasAtLeastOneBanner()) {
return banners;
}
// 没有在运行环境中配置 banner 信息时,A
if (this.fallbackBanner != null) {
return this.fallbackBanner;
}
// 没有任何的 banner 信息,使用默认
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;
}
}
代码中可以看出:默认图片的优先级由高到底为:gif, jpg, png.
A 处的 fallbackBanner 是个啥:搜索赋值的地方:
SpringApplicationBannerPrinter(ResourceLoader resourceLoader, Banner fallbackBanner) {
this.resourceLoader = resourceLoader;
this.fallbackBanner = fallbackBanner;
}
SpringApplicationBannerPrinter 的使用的位置如下:
// SpringApplication
private Banner printBanner(ConfigurableEnvironment environment) {
……
SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter(
resourceLoader, this.banner);
……
}
public void setBanner(Banner banner) {
this.banner = banner;
}
因此我们可以对 SpringApplication 实例进行 banner 属性的设置,使用方式:
SpringApplicationBuilder.banner()
SpringApplication.setBanner()
小结:
优先 spring.banner.location,spring.banner.image.location 配置的 banner
如果没有配置,则使用 classpath 里面的 banner.txt 或图片内容,图片命名为 banner.[ext], 其中 ext 的格式按照优先级高低依次是 gif, jpg, png,文本和图片可以共存,先展示图片,后展示文本。图片内部展示时不能共存。
如果没有在环境中配置,展示我们自己设置的自定义 bannenr。
如果都没有,则展示默认的 banner。