Spring Boot 學習筆記(1):自動配置、Command

jopen 8年前發布 | 33K 次閱讀 Spring JEE框架


關于 Spring Boot 一系列文章和例子,都來自《Spring Boot Cookbook》這本書,本文的主要內容是start.spring.io的使用、Spring Boot的自動配置以及CommandRunner的角色和應用場景。

1. start.spring.io的使用

首先帶你瀏覽http://start.spring.io/,在這個網址中有一些Spring Boot提供的組件,然后會給你展示如何讓你的Spring工程變得“Bootiful”,我稱之為“Boot化”。

在網站Spring Initializr上填對應的表單,描述Spring Boot項目的主要信息,例如Project Metadata、Dependency等。在Project Dependencies區域,你可以根據應用程序的功能需要選擇相應的starter。

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應用程序的依賴庫。

How do

首先我們要通過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文件的主體如下如下所示:

com.testbookpub0.0.1-SNAPSHOTjarBookPubDemo project for Spring Bootorg.springframework.bootspring-boot-starter-parent1.3.0.RELEASEUTF-81.8org.springframework.bootspring-boot-starter-data-jpaorg.springframework.bootspring-boot-starter-jdbccom.h2databaseh2runtimeorg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-maven-plugin

2. Spring Boot的自動配置

在Spring Boot項目中,xxxApplication.java會作為應用程序的入口,負責程序啟動以及一些基礎性的工作。@SpringBootApplication是這個注解是該應用程序入口的標志,然后有熟悉的main函數,通過SpringApplication.run(xxxApplication.class, args)來運行Spring Boot應用。打開SpringBootApplication注解可以發現,它是由其他幾個類組合而成的:@Configuration(等同于spring中的xml配置文件,使用Java文件做配置可以檢查類型安全)、@EnableAutoConfiguration(自動配置,稍后細講)、@ComponentScan(組件掃描,大家非常熟悉的,可以自動發現和裝配一些Bean)。

我們在pom文件里可以看到,com.h2database這個庫起作用的范圍是runtime,也就是說,當應用程序啟動時,如果Spring Boot在classpath下檢測到org.h2.Driver的存在,會自動配置H2數據庫連接。現在啟動應用程序來觀察,以驗證我們的想法。打開shell,進入項目文件夾,利用mvn spring-boot:run啟動應用程序,如下圖所示。

Spring Boot的自動配置

可以看到類似Building JPA container EntityManagerFactory for persistence unit ‘defaultHHH000412: 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數據庫(內存數據庫)。

3. 使用Command-line runners

我們新建一個StartupRunner類,該類實現CommandLineRunner接口,這個接口只有一個函數:public void run(String... args),最重要的是:這個方法會在應用程序啟動后首先被調用

How do

  • 在src/main/java/org/test/bookpub/下建立StartRunner類,代碼如下:
package com.test.bookpub;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;

public class StartupRunner implements CommandLineRunner {
    protected final Logger logger = LoggerFactory.getLogger(StartupRunner.class);
    @Override
    public void run(String... strings) throws Exception {
        logger.info("hello");
    }
}
  • 在BookPubApplication類中創建bean對象,代碼如下:
public StartupRunner schedulerRunner() {
        return new StartupRunner();
    }

還是用mvn spring-boot:run命令啟動程序,可以看到hello的輸出。對于那種只需要在應用程序啟動時執行一次的任務,非常適合利用Command line runners來完成。Spring Boot應用程序在啟動后,會遍歷CommandLineRunner接口的實例并運行它們的run方法。也可以利用@Order注解(或者實現Order接口)來規定所有CommandLineRunner實例的運行順序。

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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!