SpringBoot 入門篇(三) SpringApplication

一羞延、SpringApplication的幾種常用方式

二、定制啟動Banner

三脾还、SpringBoot事件和監(jiān)聽器

四伴箩、SpringBoot的Web環(huán)境信息

五、SpringBoot的ApplicationRunner接口 和 CommandLineRunner接口

SpringBoot版本:1.5.13.RELEASE
對應(yīng)官方文檔鏈接:https://docs.spring.io/spring-boot/docs/1.5.13.RELEASE/reference/htmlsingle/

上一篇:SpringBoot 入門篇(二) SpringBoot常用注解以及自動配置


一鄙漏、SpringApplication的幾種常用方式

??在之前的兩篇SpringBoot 入門介紹中嗤谚,都使用了在main方法中執(zhí)行SpringApplication.run()這種方式來啟動我們的工程

// 方式一
@SpringBootApplication 
public class Application {

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

}

??如果我們需要在SpringBoot啟動過程中添加一些定制代碼(如定制啟動Banner,設(shè)置自定義監(jiān)聽器等)怔蚌,這種方式就無法滿足我們的要求了巩步,因此,官方文檔提供了其他的啟動方式來滿足我們定制需求桦踊。在給出官方文檔提供的啟動方式之前椅野,我們進(jìn)入SpringApplication.run()方法簡單看下底層做了些什么動作。

??可以看到籍胯,SpringApplication.run()的底層其實就是new了一個SpringApplication的對象鳄橘,并執(zhí)行run()方法,run()方法里面執(zhí)行了哪些動作在之后的文章中詳細(xì)說明芒炼。接著我們來看官方文檔提供的啟動方式

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

到了這里瘫怜,就不在多說什么了。
??有時我們需要創(chuàng)建多層次的ApplicationContext (例如本刽,父子關(guān)系的Spring的ApplicationContext 和SpringMVC)鲸湃,這時我們可以使用官方提供的另外一種“平滑”的API調(diào)用方式來啟動工程赠涮,即使用SpringApplicationBuilder講多個方法調(diào)用串起來,通過parent() 和 child()來創(chuàng)建多層次的ApplicationContext暗挑。如果查看底層代碼笋除,可以看到除了調(diào)用child()方法略有不同,其他的和前兩種方法幾乎一樣炸裆。

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

以上三方式是SpringBoot最常用的啟動方式垃它,當(dāng)然,官方還提供了通過配置application.properties文件在SpringBoot啟動過程中添加一些定制邏輯的方案烹看。

二国拇、定制啟動Banner

??如果在啟動時,打印的如下這個圖案(Banner)不符合我們的審美咋辦惯殊?如果我們要在圖案中加入公司標(biāo)志或者版權(quán)聲明咋辦酱吝?如果我們不想打印Banner咋辦?

??SpringBoot為我們提供了修改Banner的方法土思。我們可以在類路徑下banner.txt务热、banner.gif、banner.jpg或者banner.png來定制Banner(banner.gif己儒、banner.jpg或者banner.png會“翻譯”成對應(yīng)的ASCII藝術(shù)圖案)崎岂,當(dāng)然,我們也可以在SpringBoot配置文件中指定banner.location或者banner.image.location對應(yīng)的Banner路徑來定制Banner闪湾。
??需要注意的是冲甘,當(dāng)文本文件(banner.txt)和圖像文件(banner.gif/jpg/png)是可以同時在控制臺顯示,但如果有多個圖像文件响谓,只會顯示其中排序靠后的一個(即優(yōu)先級png>jpg>gif)。

在banner.txt中還支持使用一些變量:
${spring-boot.version}:SpringBoot的版本
${spring-boot.formatted-version}:格式化后的SpringBoot的版本
${application.version}:應(yīng)用版本(在MANIFEST.MF文件中定義)
${application.formatted-version}:格式化后的應(yīng)用版本(在MANIFEST.MF文件中定義)
${application.title}:應(yīng)用名稱(在MANIFEST.MF文件中定義)
${Ansi.NAME} (${AnsiColor.NAME}, ${AnsiBackground.NAME}, ${AnsiStyle.NAME}): ANSI控制碼

??如果我們通過代碼生成定制的Banner省艳,那么可以自己實現(xiàn)Banner接口娘纷,通過實現(xiàn)printBanner()方法,并結(jié)合使用SpringApplication.setBanner(?)或者SpringApplicationBuilder.banner()的方式來打印定制的Banner跋炕。

??如果我們不想打印Banner赖晶,可以使用通過在代碼中設(shè)置Banner.Mode.OFF的方式關(guān)閉Banner打印。當(dāng)然辐烂,也可以通過在配置文件中設(shè)置 spring.main.banner-mode=off 的方式進(jìn)行關(guān)閉遏插。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Application.class);
        // 方式一
        application.setBannerMode(Banner.Mode.OFF);
        application.run(args);

         // 方式二
        /*new SpringApplicationBuilder()
                .sources(Application.class)
                .bannerMode(Banner.Mode.OFF)
                .run(args);*/
    }
}

三、SpringBoot事件和監(jiān)聽器

??事件是用來通知監(jiān)聽事件的監(jiān)聽器某件事情的處理狀態(tài)纠修,在SpringBoot啟動過程中胳嘲,除了Spring框架的事件外,SpringBoot還會觸發(fā)其他的一些事件扣草,這些事件按下列順序觸發(fā):
(1)ApplicationStartingEvent:項目剛啟動時觸發(fā)了牛,此時除了注冊監(jiān)聽器和初始器之外颜屠,其他所有處理都沒有開始;
(2)ApplicationEnvironmentPreparedEvent:上下文得到環(huán)境信息之后觸發(fā)鹰祸,此時上下文創(chuàng)建還沒有創(chuàng)建甫窟;
(3)ApplicationPreparedEvent:bean的定義信息加載完成之后觸發(fā),此時bean還沒有初始化蛙婴;
(4)ApplicationReadyEvent:在所有bean初始化完畢粗井,所有回調(diào)處理完成,系統(tǒng)準(zhǔn)備處理服務(wù)請求時觸發(fā)街图;
(5)ApplicationFailedEvent:啟動過程出現(xiàn)異常時候觸發(fā)浇衬。

??知道SpringBoot啟動時發(fā)送的時間后,我們就能自定義監(jiān)聽器對這些事件進(jìn)行監(jiān)聽台夺,從而達(dá)到擴展啟動流程的目的径玖。我們的自定義監(jiān)聽器需要實現(xiàn)ApplicationListener接口,同時指定需要監(jiān)聽哪個事件颤介。

??然后在main方法中梳星,將自定義監(jiān)聽器加入到SpringApplication中。

??除了上述代碼的方式添加監(jiān)聽器外滚朵,還可以通過在classpath下創(chuàng)建META-INF/spring.factories文件冤灾,并將自定義監(jiān)聽器通過鍵值對的形式(org.springframework.context.ApplicationListener = com.qzc.demo4.MyListener)加入到SpringApplication中。

??執(zhí)行main方法啟動工程

四辕近、SpringBoot的Web環(huán)境信息

??ApplicationContext是Spring框架中一個很重要的接口韵吨,它擴展了BeanFactory,增加了很多常用的功能移宅。SpringBoot啟動過程中归粉,SpringApplication通常會選擇合適的ApplicationContext實現(xiàn)類,在默認(rèn)情況下漏峰,如果是Web應(yīng)用糠悼,則會創(chuàng)建AnnotationConfigEmbeddedWebApplicationContext類的對象;否則會創(chuàng)建AnnotationConfigApplicationContext類的對象浅乔。
??通過查看SpringApplication,run()的底層代碼倔喂,可以看到,創(chuàng)建什么類型的ApplicationContext是由 webEnvironment 這個布爾變量來決定的靖苇,而 webEnvironment 這個變量是由項目的classpath下是否存在javax.servlet.Servlet或者org.springframework.web.context.ConfigurableWebApplicationContext席噩,如果存在其中的一個,則為true贤壁;否則為false悼枢。

??我們可以通過SpringApplication.setWebEnvironment()方法來改變webEnvironment 變量從而改變ApplicationContext的具體類型。當(dāng)然脾拆,我們還可以通過setApplicationContextClass()方法來完全定制ApplicationContext萧芙。

        SpringApplication application = new SpringApplication(Application.class);
        application.setWebEnvironment(false);
        // application.setApplicationContextClass(...);
        application.run(args);

五给梅、SpringBoot的ApplicationRunner接口 和 CommandLineRunner接口

??如果我們想在SpringBoot啟動時傳入一些參數(shù)進(jìn)行一些特殊的業(yè)務(wù)邏輯處理,此時我們可以去實現(xiàn)ApplicationRunner 或者 CommandLineRunner 接口双揪,這兩個接口都只有一個run()方法动羽,該run()方法會在SpringApplication.run(?) 完成之前被調(diào)用。另外渔期,如果我們有多個類實現(xiàn)了ApplicationRunner 或者 CommandLineRunner 接口运吓,我們可以在該類上標(biāo)注@Order注解或者讓該類再實現(xiàn)org.springframework.core.Ordered接口來保證執(zhí)行的順序。
??ApplicationRunner 和 CommandLineRunner 的區(qū)別就是封裝參數(shù)的形式不一樣疯趟,ApplicationRunner將參數(shù)封裝到ApplicationArguments類中拘哨,而CommandLineRunner 將參數(shù)傳到String可變數(shù)組中。

@Component
@Order(1) // 數(shù)值越小信峻,優(yōu)先級越高
public class MyCommandLineRunner implements CommandLineRunner {
//public class MyCommandLineRunner implements CommandLineRunner, Order {
    @Override
    public void run(String... args) {
        if (args != null) {
            for (String s : args) {
                System.out.println("MyCommandLineRunner:" + s);
            }
        }
    }

}
@Component
@Order(2) // 數(shù)值越小倦青,優(yōu)先級越高
public class MyApplicationRunner implements ApplicationRunner {
// public class MyApplicationRunner implements ApplicationRunner, Order {
    @Override
    public void run(ApplicationArguments args) {
        if (args != null) {
            String[] argArr = args.getSourceArgs();
            for (String s : argArr) {
                System.out.println("MyApplicationRunner:" + s);
            }
        }
    }
}
@SpringBootApplication
public class Application {

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

}

??在IDEA中進(jìn)行如下配置

啟動執(zhí)行main方法啟動工程可以看到


上一篇:SpringBoot 入門篇(二) SpringBoot常用注解以及自動配置
下一篇:SpringBoot 入門篇(四) SpringBoot外部配置以及優(yōu)先級

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盹舞,隨后出現(xiàn)的幾起案子产镐,更是在濱河造成了極大的恐慌,老刑警劉巖踢步,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癣亚,死亡現(xiàn)場離奇詭異,居然都是意外死亡获印,警方通過查閱死者的電腦和手機述雾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兼丰,“玉大人玻孟,你說我怎么就攤上這事△⒄鳎” “怎么了黍翎?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蟆技。 經(jīng)常有香客問我玩敏,道長斗忌,這世上最難降的妖魔是什么质礼? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮织阳,結(jié)果婚禮上眶蕉,老公的妹妹穿的比我還像新娘。我一直安慰自己唧躲,他們只是感情好造挽,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布碱璃。 她就那樣靜靜地躺著,像睡著了一般饭入。 火紅的嫁衣襯著肌膚如雪嵌器。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天谐丢,我揣著相機與錄音爽航,去河邊找鬼。 笑死乾忱,一個胖子當(dāng)著我的面吹牛讥珍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窄瘟,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼衷佃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蹄葱?” 一聲冷哼從身側(cè)響起氏义,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎新蟆,沒想到半個月后觅赊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡琼稻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年吮螺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帕翻。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸠补,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘀掸,到底是詐尸還是另有隱情紫岩,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布睬塌,位于F島的核電站泉蝌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏揩晴。R本人自食惡果不足惜勋陪,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望硫兰。 院中可真熱鬧诅愚,春花似錦、人聲如沸劫映。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雌桑,卻和暖如春喇喉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背校坑。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工轧飞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撒踪。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓过咬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親制妄。 傳聞我的和親對象是個殘疾皇子掸绞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容