SpringApplication常見用法說明


啟動方式

方式1:在main方法中執行SpringApplication.run()這種方式來啟動我們的工程

// 方式一
@SpringBootApplication 
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

方式二:SpringApplication.run()的底層其實就是new了一個SpringApplication的對象

// 方式二
public static void main(String[] args) {
    SpringApplication app = new SpringApplication(MySpringConfiguration.class);
    app.run(args);
}

方式三:SpringApplicationBuilder

// 方式三
public static void main(String[] args) {
    new SpringApplicationBuilder()
        .sources(Parent.class)
        .child(Application.class)
        .run(args);
}

有時我們需要創建多層次的ApplicationContext (例如,父子關系的Spring的ApplicationContext 和SpringMVC),這時我們可以使用官方提供的另外一種“平滑”的API調用方式來啟動工程,即使用SpringApplicationBuilder講多個方法調用串起來,通過parent() 和 child()來創建多層次的ApplicationContext。如果查看底層代碼,可以看到除了調用child()方法略有不同,其他的和前兩種方法幾乎一樣。

啟動失敗

如果你的應用程序啟動失敗,注冊的FailureAnalyzers將有機會提供專用的錯誤消息和解決問題的具體操作。例如,如果你在端口8080上啟動web應用程序,並且該端口已經在使用,你應該會看到類似於以下消息的內容:

*************************** APPLICATION FAILED TO START *************************** Description: Embedded servlet container failed to start. Port 8080 was already in use. Action: Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
Spring Boot提供了大量的 FailureAnalyzer實現,你也可以添加自己的。

如果沒有故障分析器能夠處理的異常,你仍然可以顯示完整的情況報告,以便更好地理解錯誤,要做到這一點,你需要為org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener啟用debug屬性啟用DEBUG日志記錄

例如,如果你正在使用java -jar運行你的應用程序,你可以使啟用debug屬性如下:

$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug

23.2 自定義橫幅

在啟動時打印的橫幅可以通過添加banner.txt文件到你的類路徑或設置spring.banner.location屬性指向該文件的位置。如果文件的編碼不是UTF-8,那么可以設置spring.banner.charset。除了一個文本文件,你還可以添加一個banner.gifbanner.jpgbanner.png圖像文件到你的類路徑或設置spring.banner.image.location屬性。圖像被轉換成ASCII藝術表示,並打印在任何文本標題之上。

在你的banner.txt文件,你可以使用以下任何一個占位符:

表23.1. Banner變量

變量 描述
${application.version} MANIFEST.MF中聲明的應用程序的版本號,例如,Implementation-Version:1.0被打印為1.0
${application.formatted-version} 應用程序的版本號,如在MANIFEST.MF中聲明並格式化以供顯示(包含了括號和前綴v),例如(v1.0)
${spring-boot.version} 你正在使用的Spring Boot版本,例如2.0.5.RELEASE
${spring-boot.formatted-version} 你正在使用的Spring Boot版本,格式化用於顯示(用括號括起來,並以v為前綴),例如(v2.0.5.RELEASE)
${Ansi.NAME}${AnsiColor.NAME} NAME是ANSI轉義代碼的名稱,有關詳細信息,請參閱AnsiPropertySource
${application.title} 你的應用程序的標題,如聲明的那樣,在MANIFEST.MF中,例如,Implementation-Title:MyApp被打印為MyApp
如果你想以編程的方式生成橫幅,則可以使用 SpringApplication.setBanner(…)方法,使用 org.springframework.boot.Banner接口和實現你自己的 printBanner()方法。

示例:

           // 啟動顏色格式化
           // 這不是唯一啟動顏色格式的方式,有興趣的同學可以查看源碼
           /**
             * 1. AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);
             * 2. 在`src/main/resources`目錄下新建文件`application.properties`,
             *    內容為:`spring.output.ansi.enabled=always`
             * 
             * 重要:如果配置第二種方式,第一種方式就不會起作用
             */
            AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);
            new SpringApplicationBuilder(ConfigServer.class)//
                    .main(SpringVersion.class) // 這個是為了可以加載 Spring 版本
                    .bannerMode(org.springframework.boot.Banner.Mode.CONSOLE)// 控制台打印
                    .run(args);

 resources目錄,增加一個banner.txt文件

你也可以用spring.main.banner-mode屬性確定橫幅是否必須打印在系統上System.out(console),發送到已配置的日志記錄器(log),或根本沒有生成(off)。

在以下名稱中,打印的橫幅被注冊為一個單例bean:springBootBanner

YAML映射 offfalse,所以如果你想要禁用應用程序中的banner,請確保添加引號,如下例所示:
spring:  main: banner-mode: "off"

23.3 定制SpringApplication

如果SpringApplication的默認值不符合你的喜好,你可以創建一個本地實例並自定義它,例如,要關閉橫幅,你可以寫:

public static void main(String[] args) { SpringApplication app = new SpringApplication(MySpringConfiguration.class); app.setBannerMode(Banner.Mode.OFF); app.run(args); }
傳遞給 SpringApplication的構造函數參數是Spring bean的配置源,在大多數情況下,這些都是對 @Configuration類的引用,但是它們也可以是對XML配置的引用,或者對應該被掃描的包的引用。

還可以使用application.properties配置SpringApplication,詳見第24節,外部化配置

有關配置選項的完整列表,請參見SpringApplication Javadoc

23.4 Fluent構建器API

如果你需要構建ApplicationContext層次結構(包含parentchild關系的多個上下文),或者你更喜歡使用“fluent”構建器API,那么你可以使用SpringApplicationBuilder

SpringApplicationBuilder允許你將多個方法調用鏈接在一起,並包含讓你創建層次結構的父類和子方法,如下例所示:

new SpringApplicationBuilder() .sources(Parent.class) .child(Application.class) .bannerMode(Banner.Mode.OFF) .run(args);
在創建 ApplicationContext層次結構時,有一些限制,例如,Web組件必須包含在子上下文內,並且在父類和子上下文環境中都使用相同的 Environment,請參閱 SpringApplicationBuilder Javadoc了解詳細信息。

23.5 應用程序事件和監聽

除了通常的Spring框架事件,比如ContextRefreshedEvent之外,SpringApplication還會發送一些附加的應用程序事件。

在創建 ApplicationContext之前,實際上觸發了一些事件,因此不能將偵聽器注冊為 @Bean。你可以使用 SpringApplication.addListeners(...) 方法或 SpringApplicationBuilder.listeners(...)方法注冊它們。如果你希望這些監聽器自動注冊,不管應用程序是如何創建的,你都可以添加一個 META-INF/spring.factories文件到你的項目,並通過使用 org.springframework.context.ApplicationListener key來引用你的監聽器,如下例所示:

org.springframework.context.ApplicationListener=com.example.project.MyListener

應用程序事件按以下順序發送:

  1. 一個ApplicationStartingEvent是在運行開始時發送的,但是在任何處理之前,除了偵聽器和初始化器的注冊之外。
  2. 在創建上下文之前,當Environment在上下文中被使用時,就會發送一個ApplicationEnvironmentPreparedEvent
  3. 一個ApplicationPreparedEvent是在刷新開始之前發送的,但是在加載了bean定義之后。
  4. 在調用上下文之后發送一個ApplicationStartedEvent,但是在調用任何應用程序和命令行運行程序之前。
  5. 在調用任何應用程序和命令行運行程序后,將發送一個ApplicationReadyEvent,它表明應用程序已經准備好服務請求。
  6. 如果啟動時出現異常,則發送ApplicationFailedEvent
你通常不需要使用應用程序事件,但是知道它們的存在是很方便的。在內部,Spring Boot使用事件來處理各種任務。

使用Spring Framework的事件發布機制發送應用程序事件,該機制的一部分確保在子環境中發布給偵聽器的事件也會在任何祖先上下文中被發布給監聽器。因此,如果你的應用程序使用了SpringApplication實例的層次結構,那么偵聽器可能會接收到相同類型的應用程序事件的多個實例。

為了讓你的偵聽器區分事件的上下文和派生上下文的事件,它應該請求將其應用程序上下文注入,然后將注入的上下文與事件上下文進行比較,可以通過實現ApplicationContextAware或如果偵聽器是bean,通過使用@Autowired來注入上下文。

23.6 Web環境

SpringApplication試圖為你創建合適的ApplicationContext類型,用於確定WebEnvironmentType的算法相當簡單:

  • 如果Spring MVC存在,則使用AnnotationConfigServletWebServerApplicationContext
  • 如果Spring MVC不存在,Spring WebFlux是存在的,那么就使用一個AnnotationConfigReactiveWebServerApplicationContext
  • 否則,AnnotationConfigApplicationContext被使用。

這意味着如果你使用Spring MVC和來自Spring WebFlux的新WebClient在相同的應用程序中,Spring MVC將在默認情況下使用,你可以通過調用setWebApplicationType(WebApplicationType)來輕松覆蓋它。

還可以調用setApplicationContextClass(…)完全控制所使用的ApplicationContext類型。

在JUnit測試中使用 SpringApplication時,通常需要調用 setWebApplicationType(WebApplicationType.NONE)

23.7 訪問應用程序參數

如果你需要訪問傳遞給SpringApplication.run(…)的應用程序參數,你可以注入一個org.springframework.boot.ApplicationArguments bean,ApplicationArguments接口提供了對原始String[]參數以及解析optionnon-option參數的訪問,如下例所示:

import org.springframework.boot.*; import org.springframework.beans.factory.annotation.*; import org.springframework.stereotype.*; @Component public class MyBean { @Autowired public MyBean(ApplicationArguments args) { boolean debug = args.containsOption("debug"); List<String> files = args.getNonOptionArgs(); // if run with "--debug logfile.txt" debug=true, files=["logfile.txt"] } }
Spring Boot還會在Spring Environment中注冊一個 CommandLinePropertySource,這允許你使用 @Value注解注入單個應用程序參數。

23.8 使用ApplicationRunner或CommandLineRunner

如果你需要在SpringApplication啟動之后運行一些特定的代碼,你可以實現ApplicationRunnerCommandLineRunner接口,兩個接口都以相同的方式工作,並提供了一個單獨的run方法,在SpringApplication.run(…)完成之前調用。

CommandLineRunner接口提供對應用程序參數的訪問作為一個簡單的字符串數組,而ApplicationRunner使用前面討論的ApplicationArguments接口。下面的示例展示了一個使用run方法的CommandLineRunner:

import org.springframework.boot.*; import org.springframework.stereotype.*; @Component public class MyBean implements CommandLineRunner { public void run(String... args) { // Do something... } }

如果定義了多個CommandLineRunnerApplicationRunner bean,必須以特定的順序調用它們,那么你可以額外地實現org.springframework.core.Ordered接口或使用org.springframework.core.annotation.Order注解。

23.9 應用程序退出

每個SpringApplication都向JVM注冊一個關閉hook以確保ApplicationContext在退出時優雅地關閉。可以使用所有標准的Spring生命周期回調函數(如DisposableBean接口或@PreDestroy注解)。

此外,當SpringApplication.exit()被調用時如果希望返回特定的退出代碼則bean可以實現org.springframework.boot.ExitCodeGenerator接口。然后可以將此退出代碼傳遞給System.exit(),以將其作為狀態代碼返回,如下面的示例所示:

@SpringBootApplication public class ExitCodeApplication { @Bean public ExitCodeGenerator exitCodeGenerator() { return () -> 42; } public static void main(String[] args) { System.exit(SpringApplication .exit(SpringApplication.run(ExitCodeApplication.class, args))); } }

此外,ExitCodeGenerator接口也可以由異常來實現,當遇到這樣的異常時,Spring Boot返回由實現的getExitCode()方法提供的退出代碼。

23.10 管理功能

通過指定spring.application.admin.enabled屬性可以為應用程序啟用與admin相關的特性,這將在平台MBeanServer上公開SpringApplicationAdminMXBean,你可以使用該特性遠程管理你的Spring Boot應用程序,這個特性還可以用於任何服務wrapper實現。

如果你想知道應用程序正在運行哪個HTTP端口,請使用 local.server.port的鍵獲取該屬性。
在啟用該特性時要注意,因為 MBean公開了關閉應用程序的方法。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM