SpringBoot2.0 (三)——特性

1. SpringApplication

SpringApplication 提供了一種很方便的方法去引導(dǎo)Spring Application 啟動,那就是 main () 方法。在很多情況下,你僅僅需要委托給靜態(tài)的SpringApplication.run ( ) 方法。

public static void main(String[] args) {
    SpringApplication.run(MySpringConfiguration.class, args);
}
  1. 啟動失敗
  2. 配置Banner
  3. 配置SpringApplication
    如果默認的SpringApplication配置不適合你的口味,你可以創(chuàng)建一個本地的實例代替它。例如,關(guān)閉Banner 你可以這樣寫。
SpringApplication app = new SpringApplication(MySpringConfiguration.class);
          app.setBannerMode(Banner.Mode.OFF);
          app.run(args);

當然你可以在applicatio.properties 進行配置。

  1. Fluent builder API
    如果你需要構(gòu)建SpringApplication的層次結(jié)構(gòu)(多個上下文父子關(guān)系),或者假如你僅僅是更喜歡用一下“Fluent” builder API,你可以使用 SpringApplicationBuilder。它允許你把多個方法調(diào)用鏈放在一起,包括父/子的方法,讓你創(chuàng)建一個層次結(jié)構(gòu)。
    例如:
new SpringApplicationBuilder()
        .sources(Parent.class)
        .child(Application.class)
        .bannerMode(Banner.Mode.OFF)
        .run(args);
  1. Application events 和 listeners
  2. Web environment
  3. Accessing Application argument(訪問應(yīng)用的參數(shù))
  4. 使用ApplicationRunner 和 CommandLIneRunner
    如果你需要在SpringApplication剛啟動之后運行一些特殊的代碼,你可以繼承ApplicationRunner或者CommandLineRunner 接口。這兩個接口用同一個方式提供一個在SpringApplication.run(...)完成被調(diào)用的run方法。
import org.springframework.boot.*
import org.springframework.stereotype.*
@Component
public class MyBean implements CommandLineRunner {
    public void run(String... args) {
        // Do something...
    }
}
  1. Application exit(退出)
    每一個SpringApplication 都會注冊一個shutdown鉤子與JVM以確保ApplicationContext關(guān)閉可以優(yōu)雅的退出。Spring所有標準的生命周期回調(diào)(例如DisposableBeans接口,或者@PreDestroy注解)可以被使用。
    另外,beans 可能實現(xiàn)org.springframework.boot.ExitCodeGenerator 接口,假如他們希望在應(yīng)用結(jié)束的時候返回一個特殊的退出碼。

  2. Admin feature

2. 外部化配置

Spring Boot 允許你去擴展你的配置,所以你可以用同樣的Application 代碼在不同的環(huán)境中工作。你可以使用properties文件、YAML文件,環(huán)境變量和命令行參數(shù)。屬性值可以使用@Value 注解 直接注入到你的Beans中。通過Spring的抽象環(huán)境訪問或者通過@ConfigurationProperties綁定到結(jié)構(gòu)化對象中。SpringBoot 使用特別的PropertySource 以便允許合理的覆蓋值。屬性應(yīng)該按照以下的順序。(順序省略,請查看文檔。)

  1. 配置隨機值
    RandomValuePropertySource 對于注入隨機值是很有用處的。他能產(chǎn)出Integers、longs、uuids、strings 等等。
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}
  1. 通過命令行訪問屬性

  2. Application property 文件
    SpringApplication 會從application.properties 文件中加載屬性文件并把他們添加到Spring Environment中。 優(yōu)先級是:

    1. A /config 當前的目錄的子目錄
    2. 當前目錄
    3. A classpath /config package
    4. The classpath root
  3. 類型安全的配置屬性
    使用@Value("${property}") 注解去注入配置屬性有時會很麻煩,特別是如果你使用多個屬性或者數(shù)據(jù)本質(zhì)上是分層的。SpringBoot 提供另一種使用屬性的方法。允許強類型的bean配置管理和驗證你的應(yīng)用程序。

package com.example;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("foo")
public class FooProperties {

    private boolean enabled;

    private InetAddress remoteAddress;

    private final Security security = new Security();

    public boolean isEnabled() { ... }

    public void setEnabled(boolean enabled) { ... }

    public InetAddress getRemoteAddress() { ... }

    public void setRemoteAddress(InetAddress remoteAddress) { ... }

    public Security getSecurity() { ... }

    public static class Security {

        private String username;

        private String password;

        private List<String> roles = new ArrayList<>(Collections.singleton("USER"));

        public String getUsername() { ... }

        public void setUsername(String username) { ... }

        public String getPassword() { ... }

        public void setPassword(String password) { ... }

        public List<String> getRoles() { ... }

        public void setRoles(List<String> roles) { ... }

    }
}

你需要將屬性類用@EnableConfigurationProperties 注解去注冊

@Configuration
@EnableConfigurationProperties(FooProperties.class)
        public class MyConfiguration {
}

盡管上面的配置會創(chuàng)建一個常規(guī)的bean,但是我們建議@ConfigurationProperties 只處理環(huán)境,而不是從上下文注入到其他的bean。已經(jīng)說過,@EnableConfigurationProperties注釋會自動應(yīng)用到你的項目,以便任何現(xiàn)有的bean 注釋@ConfigurationProperties配置環(huán)境。

3. 配置文件

Spring 配置提供了一種方式來隔離部分配置,使其只能在特定的環(huán)境中生效。@Component 和 @Configuration 在加載時候可以用@Profile 限制。

@Configuration
@Profile("production")
public class ProductionConfiguration {
    // TODO
}

Spring通常方法是使用spring.profile.active 環(huán)境屬性去指定哪一個配置被激活。你可以用任何一種常用的方式去指定屬性,例如:

spring.profiles.active = dev, hsqldb

或者通過命令行的方式進行指定。

4. 日志

5. 開發(fā) web 應(yīng)用

SpringBoot 也很適合web的開發(fā)??梢院苋菀椎膭?chuàng)建一個Tomcat、Jetty、Underow 服務(wù)。大部分的web應(yīng)用使用spring-boot-starter-web 模塊開始并快速運行。

  1. Spring Web MVC 框架
    Spring MVC 框架是一個包含“ model view controller ”的web框架。SpringMVC 讓我們創(chuàng)建特殊的@Controller 或者是 @RestController beans 去處理HTTP請求。使用@RequestMapping注解去匹配HTTP請求。
@RestController
@RequestMapping(value="/users")
public class MyRestController {
    @RequestMapping(value="/{user}", method=RequestMethod.GET)
    public User getUser(@PathVariable Long user) {
        // ...
    }
    @RequestMapping(value="/{user}/customers", method=RequestMethod.GET)
    List<Customer> getUserCustomers(@PathVariable Long user) {
        // ...
    }
    @RequestMapping(value="/{user}", method=RequestMethod.DELETE)
    public User deleteUser(@PathVariable Long user) {
        // ...
    }
}

Spring MVC 自動配置

  1. 包括 ContentNegotiatingViewResolver 和BeanNameViewResolver beans。
  2. 支持服務(wù)靜態(tài)資源,包括WebJars 的支持
  3. 自動注冊Converter、GenericConverter、Formatter beans。
  4. 支持HttpMessageConverters
  5. 自動注冊MessageCodesResolver
  6. 靜態(tài)的index.html
  7. 支持自定義圖標
  8. 自動使用ConfigurableWebBindingInitializer bean。

HttpMessageConverters(Http信息轉(zhuǎn)換器)

Spring MVC 使用HttpMessageConverter接口去轉(zhuǎn)換HTTP請求和響應(yīng)。開箱即用,例如對象可以自動轉(zhuǎn)換成JSON或XML。字符編碼默認是UTF-8。如果你需要添加或者定制轉(zhuǎn)換器,看下面例子:

import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.context.annotation.*;
import org.springframework.http.converter.*;

@Configuration
public class MyConfiguration {

    @Bean
    public HttpMessageConverters customConverters() {
        HttpMessageConverter<?> additional = ...
        HttpMessageConverter<?> another = ...
        return new HttpMessageConverters(additional, another);
    }

}

定制JSON序列化和反序列化

如果你使用Jackson去序列化和反序列化JSON數(shù)據(jù),你可能想寫你自己的序列化和反序列化的類。SpringBoot 提供了@JsonComponent 注解可以直接注冊。@JsonComponent會被自動的掃描到。
例如:

import java.io.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import org.springframework.boot.jackson.*;

@JsonComponent
public class Example {

    public static class Serializer extends JsonSerializer<SomeObject> {
        // ...
    }

    public static class Deserializer extends JsonDeserializer<SomeObject> {
        // ...
    }

}

MessageCodesResolver

SpringMVC 有個策略為直接生成錯誤碼呈現(xiàn)錯誤消息綁定錯誤。如果你設(shè)置spring.mvc.message-code-resolver.format 的屬性 PREFIX_ERROR_CODE 或者 POSTFIX_ERROR_CODE,SpringBoot將會為你創(chuàng)建它。

Static Content (靜態(tài)內(nèi)容)

Spring Boot 默認的靜態(tài)資源在 /static 文件夾內(nèi)(或者是/public 或者是 /resource)在 classpath 或者是 SerletContext根部。它使用的是Spring MVC的 ResourceHttpRequestHandler 方法,所以你可以通過添加你自己的WebMvcConfigurerAdapter并重寫addResourceHandlers方法來修改他的默認行為。

定制圖標

ConfigurableWebBingingInitializer

Spring MVC 使用 ConfigurableWebBingingInitializer 去初始化 WebDataBinder 為特定的請求。假如你創(chuàng)建你自己的ConfigurableWebBingingInitializer @Bean, SpringBoot 將會自動的配置SpringMVC 使用它。

模板引擎

錯誤處理

6. 安全(Security)

假如添加了SpringSecurity 在環(huán)境中,那么web應(yīng)用的默認安全認證是所有HTTP端的。添加方法級的安全你需要添加@EnableGlobalMethodSecurity 注解在你想設(shè)置的地方。
默認的security配置實現(xiàn)在 SecurityAutoConfiguration

7. 使用 SQL 數(shù)據(jù)庫

8. 使用NoSQL 數(shù)據(jù)庫

9. 緩存 (Caching)

10. 消息 (Messaging)

11. 調(diào)用 REST 服務(wù)

12. 驗證 (Validation)

13. 發(fā)送郵件

14. 用JTA 進行分布式事物

15. Hazelcast

16. Spring 集成( Integration )

17. Spring Session

18. 在JAX監(jiān)控和管理

19. 測試

20. WebSockets

21. Web Services

22. 創(chuàng)建你自己的自動配置

23. 下一步學習內(nèi)容

END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內(nèi)容