摘要:在創(chuàng)建之前,實際上觸發(fā)了一些事件,因此不能將偵聽器注冊為。使用的事件發(fā)布機制發(fā)送應(yīng)用程序事件,該機制的一部分確保在子環(huán)境中發(fā)布給偵聽器的事件也會在任何祖先上下文中被發(fā)布給監(jiān)聽器。
23. SpringApplication
SpringApplication類提供了一種方便的方法來引導從main()方法開始的Spring應(yīng)用程序。在許多情況下,你可以委托給靜態(tài)SpringApplication.run方法,如下例所示:
public static void main(String[] args) { SpringApplication.run(MySpringConfiguration.class, args); }
當你的應(yīng)用程序啟動時,你應(yīng)該看到類似于以下輸出的內(nèi)容:
. ____ _ __ _ _ / / ___"_ __ _ _(_)_ __ __ _ ( ( )\___ | "_ | "_| | "_ / _` | / ___)| |_)| | | | | || (_| | ) ) ) ) " |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: v2.0.5.RELEASE 2013-07-31 00:08:16.117 INFO 56603 --- [ Starting SampleApplication v0.1.0 on mycomputer with PID 56603 (/apps/myapp.jar started by pwebb) 2013-07-31 00:08:16.166 INFO 56603 --- [main] ationConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext @6e5a8246:startup date [Wed Jul 31 00:08:16 PDT 2013]; root of context hierarchy 2014-03-04 13:09:54.912 INFO 41370 --- [main] .t.TomcatServletWebServerFactory : Server initialized with port: 8080 2014-03-04 13:09:56.501 INFO 41370 --- [main] o.s.b.s.app.SampleApplication : Started SampleApplication in 2.992 seconds (JVM running for 3.658)
默認情況下,顯示INFO日志消息,包括一些相關(guān)的啟動細節(jié),比如啟動應(yīng)用程序的用戶。如果你需要一個除INFO之外的日志級別,你可以設(shè)置它,如第26.4節(jié)所述,“日志級別”。
23.1 啟動失敗如果你的應(yīng)用程序啟動失敗,注冊的FailureAnalyzers將有機會提供專用的錯誤消息和解決問題的具體操作。例如,如果你在端口8080上啟動web應(yīng)用程序,并且該端口已經(jīng)在使用,你應(yīng)該會看到類似于以下消息的內(nèi)容:
*************************** 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實現(xiàn),你也可以添加自己的。
如果沒有故障分析器能夠處理的異常,你仍然可以顯示完整的情況報告,以便更好地理解錯誤,要做到這一點,你需要為org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener啟用debug屬性或啟用DEBUG日志記錄。
例如,如果你正在使用java -jar運行你的應(yīng)用程序,你可以使啟用debug屬性如下:
$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug23.2 自定義橫幅
在啟動時打印的橫幅可以通過添加banner.txt文件到你的類路徑或設(shè)置spring.banner.location屬性指向該文件的位置。如果文件的編碼不是UTF-8,那么可以設(shè)置spring.banner.charset。除了一個文本文件,你還可以添加一個banner.gif、banner.jpg或banner.png圖像文件到你的類路徑或設(shè)置spring.banner.image.location屬性。圖像被轉(zhuǎn)換成ASCII藝術(shù)表示,并打印在任何文本標題之上。
在你的banner.txt文件,你可以使用以下任何一個占位符:
表23.1. Banner變量
變量 | 描述 |
---|---|
${application.version} | 在MANIFEST.MF中聲明的應(yīng)用程序的版本號,例如,Implementation-Version:1.0被打印為1.0 |
${application.formatted-version} | 應(yīng)用程序的版本號,如在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轉(zhuǎn)義代碼的名稱,有關(guān)詳細信息,請參閱AnsiPropertySource |
${application.title} | 你的應(yīng)用程序的標題,如聲明的那樣,在MANIFEST.MF中,例如,Implementation-Title:MyApp被打印為MyApp) |
如果你想以編程的方式生成橫幅,則可以使用SpringApplication.setBanner(…)方法,使用org.springframework.boot.Banner接口和實現(xiàn)你自己的printBanner()方法。
你也可以用spring.main.banner-mode屬性確定橫幅是否必須打印在系統(tǒng)上System.out(console),發(fā)送到已配置的日志記錄器(log),或根本沒有生成(off)。
在以下名稱中,打印的橫幅被注冊為一個單例bean:springBootBanner。
YAML映射off到false,所以如果你想要禁用應(yīng)用程序中的banner,請確保添加引號,如下例所示:
spring: main: banner-mode: "off"23.3 定制SpringApplication
如果SpringApplication的默認值不符合你的喜好,你可以創(chuàng)建一個本地實例并自定義它,例如,要關(guān)閉橫幅,你可以寫:
public static void main(String[] args) { SpringApplication app = new SpringApplication(MySpringConfiguration.class); app.setBannerMode(Banner.Mode.OFF); app.run(args); }
傳遞給SpringApplication的構(gòu)造函數(shù)參數(shù)是Spring bean的配置源,在大多數(shù)情況下,這些都是對@Configuration類的引用,但是它們也可以是對XML配置的引用,或者對應(yīng)該被掃描的包的引用。
還可以使用application.properties配置SpringApplication,詳見第24節(jié),外部化配置。
有關(guān)配置選項的完整列表,請參見SpringApplication Javadoc。
23.4 Fluent構(gòu)建器API如果你需要構(gòu)建ApplicationContext層次結(jié)構(gòu)(包含parent和child關(guān)系的多個上下文),或者你更喜歡使用“fluent”構(gòu)建器API,那么你可以使用SpringApplicationBuilder。
SpringApplicationBuilder允許你將多個方法調(diào)用鏈接在一起,并包含讓你創(chuàng)建層次結(jié)構(gòu)的父類和子方法,如下例所示:
new SpringApplicationBuilder() .sources(Parent.class) .child(Application.class) .bannerMode(Banner.Mode.OFF) .run(args);
在創(chuàng)建ApplicationContext層次結(jié)構(gòu)時,有一些限制,例如,Web組件必須包含在子上下文內(nèi),并且在父類和子上下文環(huán)境中都使用相同的Environment,請參閱SpringApplicationBuilder Javadoc了解詳細信息。23.5 應(yīng)用程序事件和監(jiān)聽
除了通常的Spring框架事件,比如ContextRefreshedEvent之外,SpringApplication還會發(fā)送一些附加的應(yīng)用程序事件。
在創(chuàng)建ApplicationContext之前,實際上觸發(fā)了一些事件,因此不能將偵聽器注冊為@Bean。你可以使用SpringApplication.addListeners(...) 方法或SpringApplicationBuilder.listeners(...)方法注冊它們。如果你希望這些監(jiān)聽器自動注冊,不管應(yīng)用程序是如何創(chuàng)建的,你都可以添加一個META-INF/spring.factories文件到你的項目,并通過使用org.springframework.context.ApplicationListener key來引用你的監(jiān)聽器,如下例所示:
org.springframework.context.ApplicationListener=com.example.project.MyListener
應(yīng)用程序事件按以下順序發(fā)送:
一個ApplicationStartingEvent是在運行開始時發(fā)送的,但是在任何處理之前,除了偵聽器和初始化器的注冊之外。
在創(chuàng)建上下文之前,當Environment在上下文中被使用時,就會發(fā)送一個ApplicationEnvironmentPreparedEvent。
一個ApplicationPreparedEvent是在刷新開始之前發(fā)送的,但是在加載了bean定義之后。
在調(diào)用上下文之后發(fā)送一個ApplicationStartedEvent,但是在調(diào)用任何應(yīng)用程序和命令行運行程序之前。
在調(diào)用任何應(yīng)用程序和命令行運行程序后,將發(fā)送一個ApplicationReadyEvent,它表明應(yīng)用程序已經(jīng)準備好服務(wù)請求。
如果啟動時出現(xiàn)異常,則發(fā)送ApplicationFailedEvent。
你通常不需要使用應(yīng)用程序事件,但是知道它們的存在是很方便的。在內(nèi)部,Spring Boot使用事件來處理各種任務(wù)。
使用Spring Framework的事件發(fā)布機制發(fā)送應(yīng)用程序事件,該機制的一部分確保在子環(huán)境中發(fā)布給偵聽器的事件也會在任何祖先上下文中被發(fā)布給監(jiān)聽器。因此,如果你的應(yīng)用程序使用了SpringApplication實例的層次結(jié)構(gòu),那么偵聽器可能會接收到相同類型的應(yīng)用程序事件的多個實例。
為了讓你的偵聽器區(qū)分事件的上下文和派生上下文的事件,它應(yīng)該請求將其應(yīng)用程序上下文注入,然后將注入的上下文與事件上下文進行比較,可以通過實現(xiàn)ApplicationContextAware或如果偵聽器是bean,通過使用@Autowired來注入上下文。
23.6 Web環(huán)境SpringApplication試圖為你創(chuàng)建合適的ApplicationContext類型,用于確定WebEnvironmentType的算法相當簡單:
如果Spring MVC存在,則使用AnnotationConfigServletWebServerApplicationContext。
如果Spring MVC不存在,Spring WebFlux是存在的,那么就使用一個AnnotationConfigReactiveWebServerApplicationContext。
否則,AnnotationConfigApplicationContext被使用。
這意味著如果你使用Spring MVC和來自Spring WebFlux的新WebClient在相同的應(yīng)用程序中,Spring MVC將在默認情況下使用,你可以通過調(diào)用setWebApplicationType(WebApplicationType)來輕松覆蓋它。
還可以調(diào)用setApplicationContextClass(…)完全控制所使用的ApplicationContext類型。
在JUnit測試中使用SpringApplication時,通常需要調(diào)用setWebApplicationType(WebApplicationType.NONE)。23.7 訪問應(yīng)用程序參數(shù)
如果你需要訪問傳遞給SpringApplication.run(…)的應(yīng)用程序參數(shù),你可以注入一個org.springframework.boot.ApplicationArguments bean,ApplicationArguments接口提供了對原始String[]參數(shù)以及解析option和non-option參數(shù)的訪問,如下例所示:
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"); Listfiles = args.getNonOptionArgs(); // if run with "--debug logfile.txt" debug=true, files=["logfile.txt"] } }
Spring Boot還會在Spring Environment中注冊一個CommandLinePropertySource,這允許你使用@Value注解注入單個應(yīng)用程序參數(shù)。23.8 使用ApplicationRunner或CommandLineRunner
如果你需要在SpringApplication啟動之后運行一些特定的代碼,你可以實現(xiàn)ApplicationRunner或CommandLineRunner接口,兩個接口都以相同的方式工作,并提供了一個多帶帶的run方法,在SpringApplication.run(…)完成之前調(diào)用。
CommandLineRunner接口提供對應(yīng)用程序參數(shù)的訪問作為一個簡單的字符串數(shù)組,而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... } }
如果定義了多個CommandLineRunner或ApplicationRunner bean,必須以特定的順序調(diào)用它們,那么你可以額外地實現(xiàn)org.springframework.core.Ordered接口或使用org.springframework.core.annotation.Order注解。
23.9 應(yīng)用程序退出每個SpringApplication都向JVM注冊一個關(guān)閉hook以確保ApplicationContext在退出時優(yōu)雅地關(guān)閉。可以使用所有標準的Spring生命周期回調(diào)函數(shù)(如DisposableBean接口或@PreDestroy注解)。
此外,當SpringApplication.exit()被調(diào)用時如果希望返回特定的退出代碼則bean可以實現(xiàn)org.springframework.boot.ExitCodeGenerator接口。然后可以將此退出代碼傳遞給System.exit(),以將其作為狀態(tài)代碼返回,如下面的示例所示:
@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接口也可以由異常來實現(xiàn),當遇到這樣的異常時,Spring Boot返回由實現(xiàn)的getExitCode()方法提供的退出代碼。
23.10 管理功能通過指定spring.application.admin.enabled屬性可以為應(yīng)用程序啟用與admin相關(guān)的特性,這將在平臺MBeanServer上公開SpringApplicationAdminMXBean,你可以使用該特性遠程管理你的Spring Boot應(yīng)用程序,這個特性還可以用于任何服務(wù)wrapper實現(xiàn)。
如果你想知道應(yīng)用程序正在運行哪個HTTP端口,請使用local.server.port的鍵獲取該屬性。
在啟用該特性時要注意,因為MBean公開了關(guān)閉應(yīng)用程序的方法。上一篇:開發(fā)者工具 下一篇:外部化配置
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/69608.html
18. 使用@SpringBootApplication注解 許多Spring Boot開發(fā)人員喜歡他們的應(yīng)用程序使用自動配置、組件掃描,并能夠在他們的應(yīng)用程序類上定義額外的配置,可以使用一個@SpringBootApplication注解來啟用這三個特性: @EnableAutoConfiguration:啟用Spring Boot的自動配置機制 @ComponentScan:在應(yīng)用程序...
摘要:配置文件配置文件提供了一種方法來隔離應(yīng)用程序配置的部分,并使其僅在某些環(huán)境中可用。特殊配置的配置文件或和通過引用的文件的特殊配置文件的變體被視為文件并被加載。 25. 配置文件 Spring配置文件提供了一種方法來隔離應(yīng)用程序配置的部分,并使其僅在某些環(huán)境中可用。任何@Component或@Configuration都可以標記為@Profile,以限制加載時的限制,如下例所示: @Co...
摘要:開發(fā)你的第一個應(yīng)用程序本節(jié)描述如何開發(fā)一個簡單的應(yīng)用程序來突出了的一些關(guān)鍵特性,我們使用來構(gòu)建這個項目,因為大多數(shù)都支持它。如果你希望分發(fā)一個自包含的應(yīng)用程序,這可能會有問題。 11. 開發(fā)你的第一個Spring Boot應(yīng)用程序 本節(jié)描述如何開發(fā)一個簡單的Hello World! web應(yīng)用程序來突出了Spring Boot的一些關(guān)鍵特性,我們使用Maven來構(gòu)建這個項目,因為大多數(shù)...
摘要:系列文章更新計劃列表主要對一些中常用的框架進行簡單的介紹及快速上手,外加相關(guān)資料的收集更新列表會不定期的加入新的內(nèi)容以進行擴充,如果你對此感興趣可以站內(nèi)聯(lián)系我。 導讀: 從第一次接觸Spring Boot 至今已經(jīng)有半年多了,在這期間也瀏覽了許多和Spring Boot 相關(guān)的書籍及文章,公司里面的許多項目也一直在使用Spring Boot。關(guān)于Spring Boot的一些看法:Spr...
摘要:結(jié)構(gòu)化你的代碼不需要任何特定的代碼布局來工作,然而有一些最佳實踐可以提供幫助。我們建議你遵循推薦的包命名約定和使用反向域名例如,。 14. 結(jié)構(gòu)化你的代碼 Spring Boot不需要任何特定的代碼布局來工作,然而有一些最佳實踐可以提供幫助。 14.1 使用default包 當一個類不包含package聲明時,它被認為是在default package中,使用default packa...
閱讀 1873·2023-04-26 02:46
閱讀 2003·2021-11-25 09:43
閱讀 1147·2021-09-29 09:35
閱讀 2104·2019-08-30 15:56
閱讀 3426·2019-08-30 15:54
閱讀 2637·2019-08-29 16:35
閱讀 3124·2019-08-29 15:25
閱讀 3294·2019-08-29 14:01