天天看點

Spring Boot的自動配置、Command-line Runner

接下來關于springboot的一系列文章和例子,都來自《spring boot cookbook》這本書,本文的主要内容是start.spring.io的使用、spring boot的自動配置以及commandrunner的角色和應用場景。

spring boot starters可以簡化spring項目的庫依賴管理,将某一特定功能所需要的依賴庫都整合在一起,就形成一個starter,例如:連接配接資料庫、springmvc、spring測試架構等等。簡單來說,spring boot使得你的pom檔案從此變得很清爽且易于管理。

常用的starter以及用處可以列舉如下:

spring-boot-starter: 這是核心spring boot starter,提供了大部分基礎功能,其他starter都依賴于它,是以沒有必要顯式定義它。

spring-boot-starter-actuator:主要提供監控、管理和審查應用程式的功能。

spring-boot-starter-jdbc:該starter提供對jdbc操作的支援,包括連接配接資料庫、操作資料庫,以及管理資料庫連接配接等等。

spring-boot-starter-data-jpa:jpa starter提供使用java persistence api(例如hibernate等)的依賴庫。

spring-boot-starter-data-*:提供對mongodb、data-rest或者solr的支援。

spring-boot-starter-security:提供所有spring-security的依賴庫。

spring-boot-starter-test:這個starter包括了spring-test依賴以及其他測試架構,例如junit和mockito等等。

spring-boot-starter-web:該starter包括web應用程式的依賴庫。

首先我們要通過start.spring.io建立一個圖書目錄管理程式,它會記錄出版圖書的記錄,包括作者、審閱人、出版社等等。我們将這個項目命名為bookpub,具體的操作步驟如下:

點選“switch to the full version.”,展示完整頁面;

group設定為:org.test;

artifact設定為:bookpub;

name設定為:bookpub;

package name設定為:org.test.bookpub;

packaging代表打包方式,我們選jar;

spring boot version選擇最新的1.3.0;

建立maven工程,當然,對gradle比較熟悉的同學可以選擇gradle工程。

點選“generate project”下載下傳工程包。

利用idea導入下載下傳的工程,可以看到pom檔案的主體如下如下所示:

在spring boot項目中,xxxapplication.java會作為應用程式的入口,負責程式啟動以及一些基礎性的工作。@springbootapplication是這個注解是該應用程式入口的标志,然後有熟悉的main函數,通過<code>springapplication.run(xxxapplication.class, args)</code>來運作spring boot應用。打開springbootapplication注解可以發現,它是由其他幾個類組合而成的:@configuration(等同于spring中的xml配置檔案,使用java檔案做配置可以檢查類型安全)、@enableautoconfiguration(自動配置,稍後細講)、@componentscan(元件掃描,大家非常熟悉的,可以自動發現和裝配一些bean)。

我們在pom檔案裡可以看到,com.h2database這個庫起作用的範圍是runtime,也就是說,當應用程式啟動時,如果spring boot在classpath下檢測到org.h2.driver的存在,會自動配置h2資料庫連接配接。現在啟動應用程式來觀察,以驗證我們的想法。打開shell,進入項目檔案夾,利用<code>mvn spring-boot:run</code>啟動應用程式,如下圖所示。

Spring Boot的自動配置、Command-line Runner

spring boot的自動配置

可以看到類似building jpa container entitymanagerfactory for persistence unit 'default、hhh000412: hibernate core {4.3.11.final}、hhh000400: using dialect: org.hibernate.dialect.h2dialect這些info資訊;由于我們之前選擇了jdbc和jpa等starters,spring boot将自動建立jpa容器,并使用hibernate4.3.11,使用h2dialect管理h2資料庫(記憶體資料庫)。

我們建立一個startuprunner類,該類實作commandlinerunner接口,這個接口隻有一個函數:<code>public void run(string... args)</code>,最重要的是:這個方法會在應用程式啟動後首先被調用。

在src/main/java/org/test/bookpub/下建立startrunner類,代碼如下:

在bookpubapplication類中建立bean對象,代碼如下:

還是用<code>mvn spring-boot:run</code>指令啟動程式,可以看到hello的輸出。對于那種隻需要在應用程式啟動時執行一次的任務,非常适合利用command line runners來完成。spring boot應用程式在啟動後,會周遊commandlinerunner接口的執行個體并運作它們的run方法。也可以利用@order注解(或者實作order接口)來規定所有commandlinerunner執行個體的運作順序。

利用command-line runner的這個特性,再配合依賴注入,可以在應用程式啟動時後首先引入一些依賴bean,例如data source、rpc服務或者其他子產品等等,這些對象的初始化可以放在run方法中。不過,需要注意的是,在run方法中執行初始化動作的時候一旦遇到任何異常,都會使得應用程式停止運作,是以最好利用try/catch語句處理可能遇到的異常。