鍍金池/ 教程/ Java/ Spring Boot的自動(dòng)配置、Command-line Runner
通過JMX監(jiān)控Spring Boot應(yīng)用
Spring Boot:定制PropertyEditors
配置是否初始化Bean的方法
Spring Boot的自動(dòng)配置、Command-line Runner
Spring Boot:定制URL匹配規(guī)則
Spring Boot的自動(dòng)配置、Command-line Runner
利用Mockito模擬DB
Spring Boot應(yīng)用的打包和部署
了解Spring Boot的自動(dòng)配置
Spring Boot應(yīng)用的健康監(jiān)控
了解Spring Boot的自動(dòng)配置
初始化數(shù)據(jù)庫(kù)和導(dǎo)入數(shù)據(jù)
Spring Boot應(yīng)用的健康監(jiān)控
Docker with Spring Boot
RESTful by Spring Boot with MySQL
Spring Boot:定制攔截器
Spring Boot:定制static path mappings
Spring Boot with Mysql
Spring Boot:定制自己的starter
在測(cè)試中使用內(nèi)存數(shù)據(jù)庫(kù)
Restful: Spring Boot with Mongodb
Spring Boot with Redis
Spring Boot:定制HTTP消息轉(zhuǎn)換器
Spring Boot: Data Rest Service
Spring Boot:定制type Formatters
在Spring Boot項(xiàng)目中使用Spock框架
選擇Spring Boot項(xiàng)目的內(nèi)嵌容器
通過EmbeddedServletContainerCustomizer接口調(diào)優(yōu)Tomcat
Spring Boot應(yīng)用的打包和部署
Spring Boot Admin的使用
讓你的Spring Boot工程支持HTTP和HTTPS
Spring Boot:定制servlet filters
Spring Boot:定制URL匹配規(guī)則
Spring Boot應(yīng)用的測(cè)試——Mockito
Spring Boot應(yīng)用的測(cè)試——Mockito
Spring Boot:定制servlet filters
通過@Enable*注解觸發(fā)Spring Boot配置

Spring Boot的自動(dòng)配置、Command-line Runner

接下來關(guān)于SpringBoot的一系列文章和例子,都來自《Spring Boot Cookbook》這本書,本文的主要內(nèi)容是start.spring.io的使用、Spring Boot的自動(dòng)配置以及CommandRunner的角色和應(yīng)用場(chǎng)景。

1. start.spring.io的使用

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

在網(wǎng)站Spring Initializr上填對(duì)應(yīng)的表單,描述Spring Boot項(xiàng)目的主要信息,例如Project Metadata、Dependency等。在Project Dependencies區(qū)域,你可以根據(jù)應(yīng)用程序的功能需要選擇相應(yīng)的starter。

Spring Boot starters可以簡(jiǎn)化Spring項(xiàng)目的庫(kù)依賴管理,將某一特定功能所需要的依賴庫(kù)都整合在一起,就形成一個(gè)starter,例如:連接數(shù)據(jù)庫(kù)、springmvc、spring測(cè)試框架等等。簡(jiǎn)單來說,spring boot使得你的pom文件從此變得很清爽且易于管理。

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

  • spring-boot-starter: 這是核心Spring Boot starter,提供了大部分基礎(chǔ)功能,其他starter都依賴于它,因此沒有必要顯式定義它。
  • spring-boot-starter-actuator:主要提供監(jiān)控、管理和審查應(yīng)用程序的功能。
  • spring-boot-starter-jdbc:該starter提供對(duì)JDBC操作的支持,包括連接數(shù)據(jù)庫(kù)、操作數(shù)據(jù)庫(kù),以及管理數(shù)據(jù)庫(kù)連接等等。
  • spring-boot-starter-data-jpa:JPA starter提供使用Java Persistence API(例如Hibernate等)的依賴庫(kù)。
  • spring-boot-starter-data-*:提供對(duì)MongoDB、Data-Rest或者Solr的支持。
  • spring-boot-starter-security:提供所有Spring-security的依賴庫(kù)。
  • spring-boot-starter-test:這個(gè)starter包括了spring-test依賴以及其他測(cè)試框架,例如JUnit和Mockito等等。
  • spring-boot-starter-web:該starter包括web應(yīng)用程序的依賴庫(kù)。

How do

首先我們要通過start.spring.io創(chuàng)建一個(gè)圖書目錄管理程序,它會(huì)記錄出版圖書的記錄,包括作者、審閱人、出版社等等。我們將這個(gè)項(xiàng)目命名為BookPub,具體的操作步驟如下:

  • 點(diǎn)擊“Switch to the full version.”,展示完整頁(yè)面;
  • Group設(shè)置為:org.test;
  • Artifact設(shè)置為:bookpub;
  • Name設(shè)置為:BookPub;
  • Package Name設(shè)置為:org.test.bookpub;
  • Packaging代表打包方式,我們選jar;
  • Spring Boot Version選擇最新的1.3.0;
  • 創(chuàng)建Maven工程,當(dāng)然,對(duì)Gradle比較熟悉的同學(xué)可以選擇Gradle工程。
  • 點(diǎn)擊“Generate Project”下載工程包。

利用IDEA導(dǎo)入下載的工程,可以看到pom文件的主體如下如下所示:

    <groupId>com.test</groupId>
    <artifactId>bookpub</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>BookPub</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

2. Spring Boot的自動(dòng)配置

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

我們?cè)趐om文件里可以看到,com.h2database這個(gè)庫(kù)起作用的范圍是runtime,也就是說,當(dāng)應(yīng)用程序啟動(dòng)時(shí),如果Spring Boot在classpath下檢測(cè)到org.h2.Driver的存在,會(huì)自動(dòng)配置H2數(shù)據(jù)庫(kù)連接?,F(xiàn)在啟動(dòng)應(yīng)用程序來觀察,以驗(yàn)證我們的想法。打開shell,進(jìn)入項(xiàng)目文件夾,利用mvn spring-boot:run啟動(dòng)應(yīng)用程序,如下圖所示。

http://wiki.jikexueyuan.com/project/spring-boot-cookbook-zh/images/SPRING-BOOT.png" alt="Spring Boot的自動(dòng)配置" />

可以看到類似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將自動(dòng)創(chuàng)建JPA容器,并使用Hibernate4.3.11,使用H2Dialect管理H2數(shù)據(jù)庫(kù)(內(nèi)存數(shù)據(jù)庫(kù))。

3. 使用Command-line runners

我們新建一個(gè)StartupRunner類,該類實(shí)現(xiàn)CommandLineRunner接口,這個(gè)接口只有一個(gè)函數(shù):public void run(String... args),最重要的是:這個(gè)方法會(huì)在應(yīng)用程序啟動(dòng)后首先被調(diào)用。

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類中創(chuàng)建bean對(duì)象,代碼如下:
    @Bean
    public StartupRunner schedulerRunner() {
        return new StartupRunner();
    }

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

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