1. SpringApplication
SpringApplication 提供了一種很方便的方法去引導(dǎo)Spring Application 啟動,那就是 main () 方法。在很多情況下,你僅僅需要委托給靜態(tài)的SpringApplication.run ( ) 方法。
public static void main(String[] args) {
SpringApplication.run(MySpringConfiguration.class, args);
}
- 啟動失敗
- 配置Banner
- 配置SpringApplication
如果默認的SpringApplication配置不適合你的口味,你可以創(chuàng)建一個本地的實例代替它。例如,關(guān)閉Banner 你可以這樣寫。
SpringApplication app = new SpringApplication(MySpringConfiguration.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
當然你可以在applicatio.properties 進行配置。
- 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);
- Application events 和 listeners
- Web environment
- Accessing Application argument(訪問應(yīng)用的參數(shù))
- 使用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...
}
}
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é)束的時候返回一個特殊的退出碼。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)該按照以下的順序。(順序省略,請查看文檔。)
- 配置隨機值
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]}
通過命令行訪問屬性
-
Application property 文件
SpringApplication 會從application.properties 文件中加載屬性文件并把他們添加到Spring Environment中。 優(yōu)先級是:- A /config 當前的目錄的子目錄
- 當前目錄
- A classpath /config package
- The classpath root
類型安全的配置屬性
使用@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 模塊開始并快速運行。
- 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 自動配置
- 包括 ContentNegotiatingViewResolver 和BeanNameViewResolver beans。
- 支持服務(wù)靜態(tài)資源,包括WebJars 的支持
- 自動注冊Converter、GenericConverter、Formatter beans。
- 支持HttpMessageConverters
- 自動注冊MessageCodesResolver
- 靜態(tài)的index.html
- 支持自定義圖標
- 自動使用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