spring-boot-features-spring-application介紹

引言

本文主要介紹spring-bootSpringApplication特性,對應(yīng)的spring-boot版本均為1.4.2.RELEASE,官方文檔地址為http://docs.spring.io/spring-boot/docs/1.4.2.RELEASE/reference/html/boot-features-spring-application.html

快速構(gòu)建你的第一個SpringApplication

SpringApplication提供了一種最簡單的方式來啟動應(yīng)用,那就是通過main函數(shù),只需要一行代碼就可以啟動應(yīng)用。

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

運行main函數(shù),會輸出如下信息

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.4.2.RELEASE)

2016-12-23 11:33:32.897  INFO 46716 --- [           main] org.felix.spring.boot.Application        : Starting Applicationwith PID 46716
2016-12-23 11:33:35.251  INFO 46716 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2016-12-23 11:33:35.268  INFO 46716 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.6
2016-12-23 11:33:37.305  INFO 46716 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2016-12-23 11:33:37.312  INFO 46716 --- [           main] org.felix.spring.boot.Application        : Started Application in 6.004 seconds (JVM running for 6.987)

這里省略了一些信息的輸出,從這些輸出的信息可以看到

  • Spring Boot的版本
    
  • Spring Boot內(nèi)置了一個`Apache Tomcat/8.5.6`的Tomcat
    
  • 默認的啟動端口為`8080`
    
  • 默認的日志輸出級別為`INFO`
    
  • Spring Application啟動的進程(`PID`)為46716
    

啟動時失敗

FailureAnalyzer

Spring Boot1.4版本之后新增了FailureAnalyzer接口,它可以攔截異常,并將其轉(zhuǎn)換為更易讀的診斷信息。比如當Spring Application試圖使用已被占用的端口時,將顯示如下信息

***************************
APPLICATION FAILED TO START
***************************

Description:

The Tomcat connector configured to listen on port 8196 failed to start. The port may already be in use or the connector may be misconfigured.

Action:

Verify the connector's configuration, identify and stop any process that's listening on port 8196, or configure this application to listen on another port.

Spring Boot-1.4.2-RELEASE版本內(nèi)置了以下幾個FailureAnalyzer

  • BeanCurrentlyInCreationFailureAnalyzer
  • BeanNotOfRequiredTypeFailureAnalyzer
  • BindFailureAnalyzer
  • ConnectorStartFailureAnalyzer
  • NoUniqueBeanDefinitionFailureAnalyzer
  • PortInUseFailureAnalyzer
  • ValidationExceptionFailureAnalyzer

你可以從spring-boot-1.4.2-RELEASE.jar里的META-INF/spring.factories找到上述幾個FailureAnalyzer

FailureAnalyzer小結(jié)

  • Spring Application默認是開啟FailureAnalyzer的,并沒有提供關(guān)閉的配置
  • FailureAnalyzer的配置只能通過配置文件注入
  • 如果你沒有為異常定義自己的FailureAnalyzer,你仍然可以通過--debug來打印診斷信息,比如java -jar myproject-0.0.1-SNAPSHOT.jar --debug

自定義Banner

自定義SpringApplication

如果你不喜歡默認的Spring Application,你當然可以自己去定義一個Spring Application,比如關(guān)閉Banner。

public static void main(String[] args) {
    SpringApplication app = new SpringApplication(MySpringConfiguration.class);
    app.setBannerMode(Banner.Mode.OFF);
    app.run(args);
}

Spring Boot也提供了基于配置文件application.properties的形式來構(gòu)建一個Spring Application。具體的用法可以參考Externalized Configuration

流式構(gòu)建的API(Fluent builder API)

Spring Boot提供了SpringApplicationBuilder以流式的形式來構(gòu)建Spring Application。

new SpringApplicationBuilder()
        .sources(Parent.class)
        .child(Application.class)
        .bannerMode(Banner.Mode.OFF)
        .run(args);

應(yīng)用事件和監(jiān)聽器

除了通常的Spring框架的事件,比如ContextRefreshedEvent,一個SpringApplication還會發(fā)送一些額外的應(yīng)用事件。

你不能使用@Bean去注冊一個監(jiān)聽器去監(jiān)聽在ApplicationContext被創(chuàng)建之前觸發(fā)的那些事件上。你可以通過SpringApplication.addListeners(…?)或者SpringApplicationBuilder.listeners(…?)來注冊。
如果你想自動注冊這些監(jiān)聽器不管應(yīng)用以何種方式啟動,你可以在你的工程下創(chuàng)建一個文件META-INF/spring.factories,然后引用以下配置

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

當你的應(yīng)用程序運行時,應(yīng)用事件按下列順序發(fā)送:

  1. ApplicationStartedEvent:啟動時發(fā)送該事件
  2. ApplicationEnvironmentPreparedEvent:Environment加載完成,但是上下文未創(chuàng)建發(fā)送該事件
  3. ApplicationPreparedEvent:上下文加載完成,但是spring bean未加載完成發(fā)送該事件
  4. ApplicationReadyEvent:啟動完成發(fā)送該事件,整個應(yīng)用程序處于就緒狀態(tài)
  5. ApplicationFailedEvent:啟動時異常發(fā)送該事件

WebEnvironment

Spring Appication默認是開啟Web Environment,你可以通過setWebEnvironment(false)來關(guān)閉它,比如正在使用SpringApplicationJUnit測試。

獲取應(yīng)用程序啟動時的參數(shù)

如果你使用SpringApplication.run(Application.class,args)來啟動一個Spring Application,然后你又希望你在自己定義的Bean里用到這些參數(shù),那么你可以通過注入一個ApplicationArguments來獲取,ApplicationArguments提供了各種各樣的方式來獲取參數(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");
        List<String> files = args.getNonOptionArgs();
        // if run with "--debug logfile.txt" debug=true, files=["logfile.txt"]
    }

}

當然,Spring Boot會根據(jù)Environment來注冊一個CommandLinePropertySource,你可以通過@Value來獲取

使用ApplicationRunner或者CommandLineRunner

如果你想在Spring Application啟動時運行自己的一些代碼,你可以自己定義一個Bean,實現(xiàn)接口ApplicationRunner或者CommandLineRunner。Spring Application會在SpringApplication.run(…?)之前去調(diào)用他們。

ApplicationRunnerCommandLineRunner的區(qū)別在于ApplicationRunner使用了String... args作為參數(shù),ApplicationRunner使用了ApplicationArguments作為參數(shù)。

import org.springframework.boot.*
import org.springframework.stereotype.*

@Component
public class MyBean implements CommandLineRunner {

    public void run(String... args) {
        // Do something...
    }

}

如果你定義了多個Runner,然后又希望他們是有序去執(zhí)行的,兩種方式供你選擇

  • 實現(xiàn)接口org.springframework.core.Ordered
  • 使用注解org.springframework.core.annotation.Order

優(yōu)雅退出

任何一個Spring Application都會向JVM注冊一個Shutdown Hook以便ApplicationContextSpring Application退出的時候能夠優(yōu)雅的關(guān)閉。

  • 實現(xiàn)接口DisposableBean
  • 使用注解@PreDestroy
  • 實現(xiàn)接口org.springframework.boot.ExitCodeGenerator,在Spring Application退出的時候能返回自己定義的exit code

Admin功能

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容