【轉】Spring Boot 官方文檔筆記

【轉載】原文來源:https://blog.csdn.net/luqiang81191293/article/details/54949197

Spring Boot每次發佈時都會提供一個它所支持的精選依賴列表。實際上,在構建配置裏你不需要提供任何依賴的版本,因爲Spring Boot已經替你管理好了。當更新Spring Boot時,那些依賴也會一起更新。

注 :如果有必要,你可以指定依賴的版本來覆蓋Spring Boot默認版本。Spring Boot每次發佈都關聯一個Spring框架的基礎版本,所以強烈建議你不要自己指定Spring版本。

下面說下spring boot的一些基礎知識,首先我們選定一種版本工具(這裏我選擇Maven)

一、基礎知識

1、Maven Pom

通過集成 spring-boot-starter-parent 來獲得基礎默認配置
默認的JDK1.6
默認的編碼UTF-8
默認的資源過濾
默認對 application.properties和application.yml進行了資源過濾
最後一點:由於配置文件默認接收Spring風格的佔位符(${…}),所以Maven filtering需改用@…@佔位符(你可以使用Maven屬性resource.delimiter來覆蓋它)
用法
直接集成starter-parent,以後導入其他starter就可以不寫版本號了

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.1.BUILD-SNAPSHOT</version>
</parent>

當然你也可以自己指定某個版本,比如知道spring-data的

<properties>
    <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>

不是每個人都喜歡集成一個別人的parent的,比如我有自己的parent那我應該怎麼集成boot呢?看下面

<dependencyManagement>
    <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.4.1.BUILD-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

如果你不想使用spring-boot-starter-parent,通過設置scope=import的依賴,你仍能獲取到依賴管理的,當然這樣配置你就不能像上邊一樣覆蓋默認的版本了。當然這也有別的辦法,這裏就不說了。

2、修改JDK版本

<properties>
    <java.version>1.8</java.version>
</properties>

3、spring boot maven插件

如果你想打成jar包運行,可以使用插件

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

注:如果使用Spring Boot starter parent pom 那你可以直接像上邊一樣不用寫版本和配置,因爲他已經默認配置了,如果有自己定義的配置將覆蓋默認。這個配置你還可以定製,使打出的包可以當作linux系統服務啓動,可以依賴外部配置文件當作參數

4、Starters

Starters是一個依賴描述符的集合,你可以將它包含進項目中,這樣添加依賴就非常方便。你可以獲取所有Spring及相關技術的一站式服務,而不需要翻閱示例代碼,拷貝粘貼大量的依賴描述符。例如,如果你想使用Spring和JPA進行數據庫訪問,只需要在項目中包含spring-boot-starter-data-jpa依賴,然後你就可以開始了。

該starters包含很多搭建,快速運行項目所需的依賴,並提供一致的,可管理傳遞性的依賴集。
名字有什麼含義:所有官方starters遵循相似的命名模式:spring-boot-starter-,在這裏是一種特殊的應用程序類型。該命名結構旨在幫你找到需要的starter。很多集成於IDEs中的Maven插件允許你通過名稱name搜索依賴。例如,使用相應的Eclipse或STS插件,你可以簡單地在POM編輯器中點擊ctrl-space,然後輸入"spring-boot-starter"就可以獲取一個完整列表。正如Creating your own starter章節中討論的,第三方starters不應該以spring-boot開頭,因爲它跟Spring Boot官方artifacts衝突。一個acme的第三方starter通常命名爲acme-spring-boot-starter。

有興趣的可以看下官網的說明

5、自動配置屬性

@SpringBootApplication 包含了@ComponentScan @EnableAutoConfiguration @Configuration
@EnableAutoConfiguration 默認掃描註解所在包下
@ ComponentScan 掃描包結構,掃描組件
@ Import 用來導入其他配置
如果發現啓用了不想要的自動配置項,你可以使用@EnableAutoConfiguration註解的exclude屬性禁用它們

import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;

@Configuration@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}

6、打包運行

經過一系列的配置就可以運行了

如果使用Spring Boot Maven或Gradle插件創建一個可執行jar,你可以使用java -jar運行應用。例如:

$ java -jar target/myproject-0.0.1-SNAPSHOT.jar

Spring Boot支持以遠程調試模式運行一個打包的應用,下面的命令可以爲應用關聯一個調試器:
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n
-jar target/myproject-0.0.1-SNAPSHOT.jar
當然,我們還可以使用maven插件運行

Spring Boot Maven插件包含一個run目標,可用來快速編譯和運行應用程序,並且跟在IDE運行一樣支持熱加載。

$ mvn spring-boot:run

你可以使用一些有用的操作系統環境變量:
$ export MAVEN_OPTS=-Xmx1024m -XX:MaxPermSize=128M

7、開發者工具包

Spring Boot包含了一些額外的工具集,用於提升Spring Boot應用的開發體驗。spring-boot-devtools模塊可以included到任何模塊中,以提供development-time特性,你只需簡單的將該模塊的依賴添加到構建中:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

注 在運行一個完整的,打包過的應用時,開發者工具(devtools)會被自動禁用。如果應用使用java -jar或特殊的類加載器啓動,都會被認爲是一個產品級的應用(production application),從而禁用開發者工具。

這個工具可以再開發時提供很多幫助,比如頁面不再緩存,當在IDE修改了類後會自動重啓,還有各種遠程應用的方法

二、核心特性

1、SpringApplication

SpringApplication類提供了一種快捷方式,用於從main()方法啓動Spring應用。多數情況下,你只需要將該任務委託給SpringApplication.run靜態方法

如果應用啓動失敗,註冊的FailureAnalyzers就有機會提供一個特定的錯誤信息,及具體的解決該問題的動作。例如,如果在8080端口啓動一個web應用,而該端口已被佔用,那你應該可以看到類似如下的內容:


APPLICATION FAILED TO START


Description:

Embedded servlet container failed to start. Port 8080 was already in use.

Action:

Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port.

注 Spring Boot提供很多的FailureAnalyzer實現,你自己實現也很容易。

如果沒有可用於處理該異常的失敗分析器(failure analyzers),你需要展示完整的auto-configuration報告以便更好的查看出問題的地方,因此你需要啓用org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer的debug屬性,或開啓DEBUG日誌級別。

例如,使用java -jar運行應用時,你可以通過如下命令啓用debug屬性:
$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug

自定義Banner
通過在classpath下添加一個banner.txt或設置banner.location來指定相應的文件可以改變啓動過程中打印的banner。如果這個文件有特殊的編碼,你可以使用banner.encoding設置它(默認爲UTF-8)。除了文本文件,你也可以添加一個banner.gif,banner.jpg或banner.png圖片,或設置banner.image.location屬性。圖片會轉換爲字符畫(ASCII art)形式,並在所有文本banner上方顯示。
banner的佔位符大家可以自行查詢官方文檔

注 如果想以編程的方式產生一個banner,可以使用SpringBootApplication.setBanner(…)方法,並實現org.springframework.boot.Banner接口的printBanner()方法。

你也可以使用spring.main.banner-mode屬性決定將banner打印到何處,System.out(console),配置的logger(log)或都不輸出(off)。
打印的banner將註冊成一個名爲springBootBanner的單例bean。

自定義SpringApplication
如果默認的SpringApplication不符合你的口味,你可以創建一個本地實例並對它進行自定義。例如,想要關閉banner你可以這樣寫:

public static void main(String[] args) {
    SpringApplication app = new SpringApplication(MySpringConfiguration.class);
    app.setBannerMode(Banner.Mode.OFF);
    app.run(args);
}

注:傳遞給SpringApplication的構造器參數將作爲spring beans的配置源,多數情況下,它們是一些@Configuration類的引用,但也可能是XML配置或要掃描包的引用。
你也可以使用application.properties文件來配置SpringApplication

Application事件和監聽器

除了常見的Spring框架事件,比如ContextRefreshedEvent,SpringApplication也會發送其他的application事件。

注 有些事件實際上是在ApplicationContext創建前觸發的,所以你不能在那些事件(處理類)中通過@Bean註冊監聽器,只能通過SpringApplication.addListeners(…)或SpringApplicationBuilder.listeners(…)方法註冊。如果想讓監聽器自動註冊,而不關心應用的創建方式,你可以在工程中添加一個META-INF/spring.factories文件,並使用org.springframework.context.ApplicationListener作爲key指向那些監聽器,如下:

org.springframework.context.ApplicationListener=com.example.project.MyListener

應用運行時,事件會以下面的次序發送:

在運行開始,但除了監聽器註冊和初始化以外的任何處理之前,會發送一個ApplicationStartedEvent。
在Environment將被用於已知的上下文,但在上下文被創建前,會發送一個ApplicationEnvironmentPreparedEvent。
在refresh開始前,但在bean定義已被加載後,會發送一個ApplicationPreparedEvent。
在refresh之後,相關的回調處理完,會發送一個ApplicationReadyEvent,表示應用準備好接收請求了。
啓動過程中如果出現異常,會發送一個ApplicationFailedEvent。

注 通常不需要使用application事件,但知道它們的存在是有用的(在某些場合可能會使用到),比如,在Spring Boot內部會使用事件處理各種任務

Web環境

SpringApplication將嘗試爲你創建正確類型的ApplicationContext,默認情況下,根據你開發的是否爲web應用決定使用AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext。

用於確定是否爲web環境的算法相當簡單(判斷是否存在某些類),你可以使用setWebEnvironment(boolean webEnvironment)覆蓋默認行爲。

通過調用setApplicationContextClass(…),你可以完全控制ApplicationContext的類型。
注 在Junit測試中使用SpringApplication,調用setWebEnvironment(false)是很有意義的

訪問應用參數

如果我想要獲取系統參數

如果需要獲取傳遞給SpringApplication.run(…)的應用參數,你可以注入一個org.springframework.boot.ApplicationArguments類型的bean。ApplicationArguments接口即提供對原始String[]參數的訪問,也提供對解析成option和non-option參數的訪問:

import org.springframework.boot.*
import org.springframework.beans.factory.annotation.*
import org.springframework.stereotype.*

@Componentpublic class MyBean {

    @Autowired
    public MyBean(ApplicationArguments args) {
        boolean debug = args.containsOption("debug");
        List<String> files = args.getNonOptionArgs();
        // if run with "--debug logfile.txt" debug=true, files=["logfile.txt"]
    }

}

注 Spring Boot也會註冊一個包含Spring Environment屬性的CommandLinePropertySource,這就允許你使用@Value註解注入單個的應用參數。 所以啊,用注入的更方便

使用ApplicationRunner或CommandLineRunner(注意這是啓動後執行)

如果需要在SpringApplication啓動後執行一些特殊的代碼,你可以實現ApplicationRunner或CommandLineRunner接口,這兩個接口工作方式相同,都只提供單一的run方法,該方法僅在SpringApplication.run(…)完成之前調用。
CommandLineRunner接口能夠訪問string數組類型的應用參數,而ApplicationRunner使用的是上面描述過的ApplicationArguments接口:

import org.springframework.boot.*
import org.springframework.stereotype.*

@Componentpublic class MyBean implements CommandLineRunner {

    public void run(String... args) {
        // Do something...
    }

}

如果某些定義的CommandLineRunner或ApplicationRunner beans需要以特定的順序調用,你可以實現org.springframework.core.Ordered接口或使用org.springframework.core.annotation.Order註解。

Application退出

爲確保ApplicationContext在退出時被平靜的(gracefully)關閉,每個SpringApplication都會註冊一個JVM的shutdown鉤子,所有標準的Spring生命週期回調(比如DisposableBean接口或@PreDestroy註解)都能使用。
此外,如果想在應用結束時返回特定的退出碼(exit code),這些beans可以實現org.springframework.boot.ExitCodeGenerator接口。

2、外部化配置(所有的配置都可以用命令話)

Spring Boot允許將配置外部化(externalize),這樣你就能夠在不同的環境下使用相同的代碼。你可以使用properties文件,YAML文件,環境變量和命令行參數來外部化配置。使用@Value註解,可以直接將屬性值注入到beans中,然後通過Spring的Environment抽象或通過@ConfigurationProperties綁定到結構化對象來訪問。

Spring Boot設計了一個非常特別的PropertySource順序,以允許對屬性值進行合理的覆蓋,屬性會以如下的順序進行設值:

home目錄下的devtools全局設置屬性(~/.spring-boot-devtools.properties,如果devtools激活)。
測試用例上的@TestPropertySource註解。
測試用例上的@SpringBootTest#properties註解。
命令行參數
來自SPRING_APPLICATION_JSON的屬性(環境變量或系統屬性中內嵌的內聯JSON)。
ServletConfig初始化參數。
ServletContext初始化參數。
來自於java:comp/env的JNDI屬性。
Java系統屬性(System.getProperties())。
操作系統環境變量。
RandomValuePropertySource,只包含random.*中的屬性。
沒有打進jar包的Profile-specific應用屬性(application-{profile}.properties和YAML變量)。
打進jar包中的Profile-specific應用屬性(application-{profile}.properties和YAML變量)。
沒有打進jar包的應用配置(application.properties和YAML變量)。
打進jar包中的應用配置(application.properties和YAML變量)。
@Configuration類上的@PropertySource註解。
默認屬性(使用SpringApplication.setDefaultProperties指定)。

下面是具體的示例,假設你開發一個使用name屬性的@Component:

import org.springframework.stereotype.*
import org.springframework.beans.factory.annotation.*

@Componentpublic class MyBean {
    @Value("${name}")
    private String name;
    // ...
}

你可以將一個application.properties放到應用的classpath下,爲name提供一個合適的默認屬性值。當在新的環境中運行時,可以在jar包外提供一個application.properties覆蓋name屬性。對於一次性的測試,你可以使用特定的命令行開關啓動應用(比如,java -jar app.jar --name=“Spring”)。

注 SPRING_APPLICATION_JSON屬性可以通過命令行的環境變量設置,例如,在一個UNIX shell中可以這樣:
+

$ SPRING_APPLICATION_JSON=’{“foo”:{“bar”:“spam”}}’ java -jar myapp.jar

本示例中,如果是Spring Environment,你可以以foo.bar=spam結尾;如果在一個系統變量中,可以提供作爲spring.application.json的JSON字符串:

$ java -Dspring.application.json=’{“foo”:“bar”}’ -jar myapp.jar

或命令行參數:

$ java -jar myapp.jar --spring.application.json=’{“foo”:“bar”}’

或作爲一個JNDI變量java:comp/env/spring.application.json。

配置隨機值

在注入隨機值(比如,密鑰或測試用例)時RandomValuePropertySource很有用,它能產生整數,longs或字符串,比如:

    my.secret=${random.value}
    my.number=${random.int}
    my.bignumber=${random.long}
    my.number.less.than.ten=${random.int(10)}
    my.number.in.range=${random.int[1024,65536]}

random.int*語法是OPEN value (,max) CLOSE,此處OPEN,CLOSE可以是任何字符,並且value,max是整數。如果提供max,那麼value是最小值,max是最大值(不包含在內)。

訪問命令行屬性

默認情況下,SpringApplication會將所有命令行配置參數(以’–'開頭,比如–server.port=9000)轉化成一個property,並將其添加到Spring Environment中。正如以上 節提過的,命令行屬性總是優先於其他屬性源。
如果不想將命令行屬性添加到Environment,你可以使用SpringApplication.setAddCommandLineProperties(false)來禁用它們。

Application屬性文件

SpringApplication將從以下位置加載application.properties文件,並把它們添加到Spring Environment中:

當前目錄下的/config子目錄。
當前目錄。
classpath下的/config包。
classpath根路徑(root)。

該列表是按優先級排序的(列表中位置高的路徑下定義的屬性將覆蓋位置低的)。

注 你可以使用YAML(’.yml’)文件替代’.properties’。

如果不喜歡將application.properties作爲配置文件名,你可以通過指定spring.config.name環境屬性來切換其他的名稱,也可以使用spring.config.location環境屬性引用一個明確的路徑(目錄位置或文件路徑列表以逗號分割)。

$ java -jar myproject.jar --spring.config.name=myproject

$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

注 在初期需要根據spring.config.name和spring.config.location決定加載哪個文件,所以它們必須定義爲environment屬性(通常爲OS env,系統屬性或命令行參數)。

如果spring.config.location包含目錄(相對於文件),那它們應該以/結尾(在被加載前,spring.config.name關聯的名稱將被追加到後面,包括profile-specific的文件名)。spring.config.location下定義的文件使用方法跟往常一樣,沒有profile-specific變量支持的屬性,將被profile-specific的屬性覆蓋。

不管spring.config.location配置什麼值,默認總會按照classpath:,classpath:/config,file:,file:config/的順序進行搜索,優先級由低到高,也就是file:config/獲勝。如果你指定自己的位置,它們會優先於所有的默認位置(locations),並使用相同的由低到高的優先級順序。那樣,你就可以在application.properties爲應用設置默認值,然後在運行的時候使用不同的文件覆蓋它,同時保留默認配置。

注:如果使用環境變量而不是系統屬性,需要注意多數操作系統的key名稱不允許以句號分割(period-separated),但你可以使用下劃線(underscores)代替(比如,使用SPRING_CONFIG_NAME代替spring.config.name)。

注:如果應用運行在容器中,那麼JNDI屬性(java:comp/env)或servlet上下文初始化參數可以用來代替環境變量或系統屬性,當然也可以使用環境變量或系統屬性。


作者:QIANGLU0
來源:CSDN
原文:https://blog.csdn.net/luqiang81191293/article/details/54949197
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章