iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
0
Modern Web

30天從零撰寫 Kotlin 語言並應用於 Spring Boot 開發系列 第 14

[Day 14] 遠征 Kotlin × Spring Boot 專案配置介紹

文章回顧

昨日,我們將 Spring Boot 專案建置完成,可能會有朋友好奇,為什麼我們在 DemoApplication.kt 裡面加上一段程式碼,就可以用網址找到對應的字串結果,我們來看看昨日我們加入的程式:

a. 直接在 DemoApplication.kt main函數下面加入以下程式

@RestController
class HomeController() {
    @GetMapping("/hello")
    fun getHelloString(): String {
        return "Hello, Kotlin"
    }
}

b. 加入程式碼後的結果圖
https://ithelp.ithome.com.tw/upload/images/20200923/20121179fZNa2Y0M80.png

其實我們可以觀察建置專案完成後,DemoApplication.kt 檔案的 main 函數上面會有一個@SpringBootApplication Annotation,此標註其實是 Spring Boot 專案核心標註,目的是為了開啟自動配置,而此標註裡面其實也包含了許多功能,我們可以直接進入看 @SpringBootApplication 的定義內容,如下圖:
https://ithelp.ithome.com.tw/upload/images/20200923/201211792TCE0OcphI.png

我們會觀察到它的類別名稱上使用了許多標註,我們快速簡介每個標註的作用:

@Target:描述此標註會用在什麼樣的地方
@Retention:指定此標註會保留多長時間
@Documented:主要作用是產生 javadoc 文件時,會將該標註寫入文件中
@Inherited:此標註用在類別上時,表示子類別會自動繼承此標註
@SpringBootConfiguration:繼承自 @Configuration,標註當前類別屬於配置型態
@EnableAutoConfiguration:啟動自動加入配置,導入專案內有使用到的套件
@ComponentScan:掃描專案內所有的 @Controller@Service@Component@Repository 標註

此時,我們在上面所困惑的問題就可以知道答案,是因為 Spring Boot 有透過 @ComponentScan 標註可進行抓取對應的類別與程式,而 Spring Boot 的設計目的就是將原本開發 Spring 常見複雜的開發配置進行自動化處理,讓我們快速建構專案進行後續業務邏輯的開發。但實務開發上,我們還是得需要了解如何在 Spring Boot 修改這些自動化配置,以應付實務上特殊的開發環境,故下面將會說明 Spring Boot 預設提供的 [application.properties](http://application.properties) 檔案,此檔案可以讓我們針對專案進行配置調整。

專案配置檔案-application

在 Spring Boot 專案建立完成後,會自動在專案內建立一個 application.properties 檔案進行應用程式的配置,全部參數可從 Spring 官方文件中找到說明,此篇會先說明常用的幾個參數進行說明:

配置檔案 application 預設是提供檔案格式 properties 進行配置,也同時支援現在廣泛推薦使用的 YAML 檔案格式,但 YAML 文件格式風格不像 properties 是以 鍵值(Key-Value) 文件格式表示,反而是比較偏向類似 階層縮排 文件格式進行表示,下面我們利用範例來看看兩者差異:

  • application.properties

    server.port = 9999  # 設定 Spring Boot 運行專案的 port 阜號 
    spring.jpa.show-sql = true   # Spring Data JPA 相關資訊 - 後面章節會說明
    spring.jpa.hibernate = true
    spring.jpa.hibernate.ddl-auto = true
    spring.jpa.database = h2
    spring.h2.console.enabled = true   # Spring H2 資料庫相關資訊 - 後面章節會說明
    spring.h2.console.path = /h2-console
    spring.datasource.url = jdbc:h2:file:./src/main/resources/data/employees;AUTO_SERVER=true
    
  • application.yml

    server:
      port: 9999   # 設定 Spring Boot 運行專案的 port 阜號 
    spring:
      jpa:
        show-sql: true  # Spring Data JPA 相關資訊 - 後面章節會說明
        hibernate:
          ddl-auto: update
        database: h2
      h2:  # Spring H2 資料庫相關資訊 - 後面章節會說明
        console:
          enabled: true
          path: /h2-console
      datasource:
        url: jdbc:h2:file:./src/main/resources/data/employees;AUTO_SERVER=true
    

由上面範例我們可以看到,YAML檔案格式在配置上利用階層縮排的方式表達,結構上相對更為清晰易讀,而在 Spring Boot 中若使用 YAML 檔案格式進行配置時,會無法直接支援 @PropertySource Annotation 進行配置,可以參考下圖官方文件說明,還有 YAML 在撰寫上是必須要依照順序的,否則會無法判讀,而兩種檔案格式的好壞其實是比較主觀的,很難定論哪一種格式特別好,通常會以團隊開發習慣來進行規範,而本系列目前會先採用 YAML 格式進行實作。

https://ithelp.ithome.com.tw/upload/images/20200923/20121179s7K6Hie4RD.png

在 Spring 世界目前主要有兩大專案建構工具-MavenGradle,專案建構工具可以幫助我們處理專案說明、建構專案、依賴套件、部署等專案開發事項,幫助我們讓專案有規範、自動與彈性擴充,而 Maven 早於 Gradle 發布,Maven 在文件格式上仍舊使用 XML 格式作為編寫建構配置,Gradle 則是不使用 XML 方式,採用 Groovy DSL (Domain Specific Languages)特性進行編寫,使得 Gradle 在建構配置上會比 Maven 來得更簡潔清晰、靈活性更好。

而昨天我們使用了 Maven 進行專案建置,今天我們嘗試將建立專案改為 Gradle 進行建置,只要將 New Project的 Type 改為 Gradle Project 即可,如下圖所示:

(1) 修改 New Project Type 為 Gradle Project、Language 為 Kotlin
https://ithelp.ithome.com.tw/upload/images/20200923/20121179LZCbQAz3aY.png

(2) 運行專案可使用Gradle面板 Tasks → application → bootRun,或是直接在 Terminal 輸入 ./gradlew bootRun(參考圖 3)
https://ithelp.ithome.com.tw/upload/images/20200923/20121179b2NVqm33dJ.png

(3) 如不想使用 Gradle 功能表運行的朋友,也可以使用 Terminal 進行專案運行,如果是使用 Linux/Mac 的朋友輸入「./gradlew bootRun」即可,如果是使用 Windows 的朋友,可以輸入「gradlew.bat bootRun」
https://ithelp.ithome.com.tw/upload/images/20200923/20121179rCKXRCB4oo.png

後續文章,我們會選擇使用 Gradle 進行後續功能介紹,前面會先使用 Maven 進行專案建置的原因,主要是因為在Spring 生態系找到的資料還是以 Maven 居多,希望大家還是可以了解此兩種工具是如何進行專案建置,避免在參考設定上比較不會有問題。

Reference


上一篇
[Day 13] 遠征 Kotlin × 建置 Spring Boot 專案
下一篇
[Day 15] 遠征 Kotlin × Spring Boot 設定資料庫與匯入初始資料
系列文
30天從零撰寫 Kotlin 語言並應用於 Spring Boot 開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言