SpringApplication一般,我们用 SpringApplication 来启动spring boot应用。如@SpringBootApplicationpublic 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 TextApplication Version: ${application.version}${application.formatted-version}Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}启动应用时,显示如下: Test Test Banner TextApplication Version:Spring Boot Version: 2.1.3.RELEASE (v2.1.3.RELEASE)自定义banner图:在 resources 目录下添加 banner.png 文件启动应用时显示: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@&@@@@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @:@@#@@@@@@@#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@#@@&@@@@*@:@o@@@@:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Test Test Banner TextApplication 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。