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。