Spring Boot提供的特性

1、導覽

本文主要按如下模塊介紹spring Boot(1.3.6.RELEASE)提供的特性。css

  1. SpringApplication類
  2. 外部化配置
  3. Profiles
  4. 日誌
  5. 開發WEB應用
  6. Security
  7. 使用SQL
  8. 使用NoSQL
  9. 緩存
  10. 消息
  11. 發送郵件
  12. JTA處理分佈式事務
  13. Spring Session
  14. 測試
  15. Actuator
  16. 部署

2、SpringApplication類

在主類——即帶有@SpringBootApplication註解類,的main方法裏調用SpringApplication.run(應用的Configration配置類.class,參數列表) 會啓動spring應用。默認log級別是INFO,會顯示一些相關的啓動詳情,好比啓動應用的用戶等。html

1. 使用SpringApplicationBuilder類能夠建立分層的 ApplicationContext

new SpringApplicationBuilder()
.bannerMode(Banner.Mode.OFF) .sources(Parent.class) .child(Application.class) .run(args);

2. Application事件和監聽器

除了經常使用的Spring framework事件,例如ContextRefreshedEvent等,SpringApplication也會發送一些其餘的應用事件。 
一些事件在ApplicationContext被建立以前就被觸發,所以沒法將監聽器註冊爲bean來監聽。可是可使用SpringApplication.addListeners(…) 或SpringApplicationBuilder.listeners(…)來註冊監聽器。也能夠在META-INF/spring.factories文件定義監聽器: 
org.springframework.context.ApplicationListener=com.example.project.MyListener 
應用運行時,應用事件發送順序以下: 
① 在監聽器和初始化器被初始化以後,任何其餘應用以前,應用剛開始運行時會發送一個ApplicationStartedEvent。 
② 在context被建立以前,context中要使用的Environment被知道時,一個ApplicationEnvironmentPreparedEvent被髮送。 
③ 在bean定義被加載以後,refresh啓動以前,一個ApplicationPreparedEvent被髮送。 
④ 在refresh以及任何相關的回調被處理以後,一個ApplicationReadyEvent被髮送,代表應用已準備好服務requests。 
⑤ 啓動時若是發生異常,一個ApplicationFailedEvent被髮送。java

3. web環境

SpringApplication會根據應用是否爲web來建立不一樣的ApplicationContext: AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext。 
能夠調用setWebEnvironment(boolean webEnvironment)複寫默認實現(在junit測試時置爲false最好),更可使用setApplicationContextClass(…).徹底控制ApplicationContext的建立。node

4. 在SpringApplication.run完成前執行特定代碼

使用ApplicationRunner或CommandLineRunner,並配合Order註解指定調用順序。 
CommandLineRunner的run(String …args)方法直接訪問SpringApplication.run傳遞的參數,ApplicationRunner的run方法則使用ApplicationArguments訪問參數。例如:mysql

import org.springframework.boot.* import org.springframework.stereotype.* @Component public class MyBean implements CommandLineRunner { public void run(String... args) { // Do something... } }

3、外部化配置

1. 如何引用配置的屬性

可以使用properties文件,YAML文件,環境變量,命令行參數(如 –name=」fuck」)來外部化配置。屬性值可使用@Value註解直接注入到bean中,並經過Spring的Environment抽象或通過@ ConfigurationProperties 註解綁定到結構化對象來訪問。 
示例: 
YAML文件: 
yml 屬性 
或者等效的properties文件: 
properties屬性linux

使用@Value注入單個屬性: 
單個屬性web

使用@ ConfigurationProperties注入屬性族: 
屬性組 
※ 注意裏面使用了JSR-303註解來校驗屬性值。redis

@ ConfigurationProperties還能夠用到@Bean註解的方法上。 
bean定義spring

2. 屬性加載順序

Spring按照以下順序設置properties: 
(一) 命令行參數。如:Java -jar app.jar –name=」Spring」 
(二) SPRING_APPLICATION_JSON。如java -Dspring.application.json=’{「foo」:」bar」, 「hehe」:」fuck」}’ -jar fuckapp.jar 
(三) 來自於java:comp/env的JNDI屬性 
(四) Java System properties (System.getProperties()). 
(五) OS環境變量 
(六) 只有在random.*裏包含的屬性會產生一個RandomValuePropertySource 
(七) jar包外部的,由profile指定的application properties文件(application-{profile}.properties或YAML文件) 
(八) jar包內部的,由profile指定的application properties文件(application-{profile}.properties或YAML文件) 
(九) jar包外部的application properties(application.properties和YAML)。 
(十) jar包內部的application properties(application.properties和YAML)。 
(十一) @Configuration註解類內部的@PropertySource註解 
(十二) 由SpringApplication.setDefaultProperties設置的默認屬性sql

YAML是JSON的超集,很是適合定義層級化配置數據。引入SnakeYAML庫會使SpringApplication類自動支持YAML。使用spring-boot-starter會自動引入YAML。

4、Profiles

Spring Profiles提供了一種隔離應用程序配置的方式,並讓這些配置只能在特定的環境下生效。

1. 如何配置profile

任何@Component或@Configuration都能被@Profile標記,從而限制加載它的時機。 
例如:

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

2. 如何在構建時指定profile

以正常的Spring方式,你可使用一個spring.profiles.active的Environment屬性來指定哪一個配置生效。你可使用日常的任 
何方式來指定該屬性,例如,能夠將它包含到你的application.properties中:

spring.profiles.active=dev,hsqldb

或使用命令行開關:

--spring.profiles.active=dev,hsqldb

2.1 添加激活的配置(profiles)

spring.profiles.active屬性和其餘屬性同樣都遵循上文中提到屬性加載規則,優先級最高的PropertySource獲勝。也就是說,你能夠在application.properties中指定生效的配置,而後在命令行中設置同名屬性的不一樣值來替換它們。

有些時候,將profile特定的屬性增長到active profile中,而不是直接替換會更有用。spring.profiles.include屬性就能夠用來無條件增長active profiles。SpringApplication類也提供api設置額外的profile(setAdditionalProfiles()) 
例如,按照下面的配置:

--- my.property: fromyamlfile --- spring.profiles: prod spring.profiles.include: proddb,prodmq

若是應用啓動時打開選項–spring.profiles.active=prod,則proddb和prodmq也會被激活。

2.2 編程方式設置profile

在調用SpringApplication.run以前調用SpringApplication.setAdditionalProfiles(…)便可。實現ConfigurableEnvironment接口也可行。

2.3 profile特定的配置文件

除了application.properties文件,profile特定的屬性也能經過application-{profile}.properties來定義。Spring boot提供了默認的application-default.properties文件,在沒有定義任何profile時會加載。

profile特定的屬性從跟標準application.properties相同的路徑加載,而且特定profile文件會覆蓋默認的配置。若是聲明瞭不止一個profile,則最後聲明的被採用。

2.4 屬性中的佔位符(placeholders)

application.properties中的值會將由Environment過濾,因此你能夠直接飲用以前定義的值:

app.name=MyApp app.description=${app.name} is a Spring Boot application

5、日誌

Spring Boot內部日誌使用Commons Logging,可是開發底層日誌實現。會爲Java Util Logging, Log4j, Log4j2和Logback提供默認配置。不論哪一種配置,loggers都被預配置爲使用console輸出,並提供一個可選的文件輸出。

默認狀況下,若是是使用’Starter POMs’,Logback將被用做日誌實現。

1. Log 格式

Spring Boot默認的log格式以下:

2016-07-14 17:27:33.212 INFO 13092 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 3832 ms 2016-07-14 17:27:33.668 WARN 13092 --- [ost-startStop-1] .s.b.d.a.RemoteDevToolsAutoConfiguration : Listening for remote debug traffic on /.~~spring-boot!~/debug

顯示如下內容:

  • 日期和時間—毫秒精度,利於排序
  • Log級別—ERROR, WARN, INFO, DEBUG or TRACE.
  • PID.
  • 一個— 分隔符,代表實際log消息的開始
  • 線程名—方括號中顯示(控制檯輸出時可能會被省略)
  • Logger名—通常是類名的縮寫格式
  • log消息

2. 控制檯輸出

默認,log信息被原樣輸出到控制檯,輸出ERROR, WARN, INFO級別。能夠經過如下手段激活debug模式,輸出更多的信息:

  • 在命令行使用 –debug 選項
  • 在application.properties中添加debug=true

開啓debug模式後,一些核心的loggers(如嵌入的servlet容器,hibernate和Spring)被配置輸出更多的信息。

請注意 
此處開啓的debug模式,並不是將你應用的日誌級別修改成DEBUG級別。

Spring Boot輸出日誌到控制檯時,會檢測console是否支持ansi,若是支持,會顯示彩色的日誌。能夠中止這種檢測,或更改檢測策略: 
將 spring.output.ansi.enabled 改成其餘值便可(默認是detect)。

3. 文件輸出

默認,Spring Boot只輸出日誌到console。若是還想輸出到文件,須要設置logging.file或logging.path屬性。 
它們的組合以下:

logging.file logging.path Example Description
  只輸出到console
具體文件名 my.log console和日誌文件。文件名還能夠帶路徑
具體路徑 /var/log console和路徑下的spring.log。路徑可絕對可相對

4. 日誌級別

全部支持的日誌系統在Spring的Environment(例如在application.properties裏)均可以經過’logging.level.*=LEVEL’(’LEVEL’是TRACE, DEBUG, INFO, WARN,ERROR, FATAL, OFF中的一個)來設置日誌級別。root logger能夠經過logging.level.root來配置。 
示例:application.properties

logging.level.root=WARN logging.level.org.springframework.web=DEBUG logging.level.org.hibernate=ERROR

5. 自定義日誌配置

將相應jar包放到依賴中,便可激活對應的日誌框架。將日誌的配置文件放到classpath的根目錄下,或者放到logging.config指定路徑下,就能夠自定義日誌的輸出。

注意 
由於logging實在ApplicationContext被建立以前就初始化的,所以沒法經過@Configuration註解類的@PropertySources來控制日誌。而只能經過系統屬性,環境變量和Spring Boot的外部配置文件等來配置

與日誌系統相對應的文件會被自動加載:

日誌系統 配置文件
logback logback-spring.xml, logback-spring.groovy, logback.xml,logback.groovy
Log4j log4j-spring.properties, log4j-spring.xml, log4j.properties,log4j.xml
Log4j2 log4j2-spring.xml, log4j2.xml
JDK (Java Util Logging) logging.properties

注意 
推薦使用-spring後綴的配置文件,例如logback-spring.xml,而非logback.xml。不然Spring可能沒法徹底控制log的初始化。

注意 
Java Util Logging可能會致使類加載問題,不推薦使用。

6. Logback擴展

Spring Boot爲Logback提供了一些高級配置屬性。能夠在logback-spring.xml中使用。

注意 
不能再logback.xml中使用,由於此文件加載的太早。要麼在logback-spring.xml中使用,要麼定義logging.confi屬性。

6.1 Profile特定的配置

<springProfile> 標籤容許你基於Spring profiles加入或者排除一些配置。 
例如:

<springProfile name="staging"> <!-- configuration to be enabled when the "staging" profile is active --> </springProfile> <springProfile name="dev, staging"> <!-- configuration to be enabled when the "dev" or "staging" profiles are active --> </springProfile> <springProfile name="!production"> <!-- configuration to be enabled when the "production" profile is not active --> </springProfile>

6.2 Environment屬性

<springProperty> 標籤容許你在logback配置文件中使用Spring Environment的屬性。這可讓你在logback配置中使用application.properties中的值。 
例如:

<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"/> <appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender"> <remoteHost>${fluentHost}</remoteHost> ... </appender>

6、開發web應用

Spring Boot很是適合開發web應用。你可使用內嵌的Tomcat,Jetty或Undertow輕鬆建立一個HTTP服務器。大多數的web應用都使用spring-boot-starter-web模塊進行快速搭建和運行。

1. Spring MVC

Spring Web MVC框架是一個富」模型,視圖,控制器」的web框架。 容許你建立特定的@Controller或@RestController beans來處理傳入的HTTP請求。 使用@RequestMapping註解能夠將控制器中的方法映射到相應的HTTP請求。 
Spring Boot爲MVC提供瞭如自動配置,模板引擎等不少特性。

1.1 自動配置

Sprint boot爲mvc增長以下自動配置:

  • 引入ContentNegotiatingViewResolver和BeanNameViewResolver beans。 
    ① ContentNegotiatingViewResolver是ViewResolver的一種實現,其根據請求的media type來爲請求選擇一個合適的View。請求的mediatype由ContentNegotiationManager決定。一旦請求的media type被決定,這個resolver查詢全部的view resolver,並返回最匹配的。能夠指定ContentNegotiatingViewResolver 的defaultViews屬性,在mediatype匹配時將使用此defaultViews指定的viewResolver。 
    例如,一個/view.html的請求會去尋找content type爲text/html的viewresolver;一個路徑爲/view,而且header中Accept爲text/html的請求也同理。 
    ② BeanNameViewResolver也是一種viewresolver,簡單的將view name解釋成bean 
    name。如controller中返回」view」,會去找id爲view的bean。

  • 對靜態資源的支持,包括對WebJars的支持。

  • 自動註冊Converter,GenericConverter,Formatter beans 
    Converter<S,T>用來將S轉換成T

  • 對HttpMessageConverters的支持。 
    可將對象轉換成Http request/response,或者相反。Spring MVC中,object能夠自動轉換成Json(Jackson庫)或XML(Jacksonxml或者jaxb)。String使用utf-8編碼。

  • 自動註冊MessageCodesResolver。

  • 對靜態index.html的支持。

  • 對自定義Favicon的支持。

  • ConfigurableWebBindingInitializer bean的自動使用。

※ 若要徹底掌控springmvc,應添加本身的@Configuration和@EnableWebMVC註解的類。若想保留Spring boot mvc的特性,同時添加額外的mvc配置(如攔截器,formatters,view controllers等),你能夠添加本身的WebMvcConfigurerAdapter類型的@Bean(不使用@EnableWebMVC註解)。

1.2 靜態內容

默認狀況下,Spring Boot從classpath的/static(/public,/resources或/META-INF/resources)的文件夾或從ServletContext根目錄提供靜態內容。 
這使用了Spring MVC的ResourceHttpRequestHandler,因此你能夠經過添加本身的WebMvcConfigurerAdapter並覆寫addResourceHandlers方法來改變這個行爲(加載靜態文件)。 
若是你的應用將被打包成jar,那就不要使用src/main/webapp文件夾。儘管該文件夾是一個共同的標準,但它僅在打包成war的狀況下起做用,而且若是產生一個jar,多數構建工具都會靜悄悄的忽略它。

1.3 模板引擎

Spring boot支持如下模板引擎的自動配置:freemarker, groovy, thymeleaf, velocity, mustache。 
Boot自動從src/main/resources/templates中搜索模板。 
使用內置servlet容器時要避免使用jsp,緣由以下:

  • 內置tomcat不支持執行jar裏的jsp。
  • Jetty在jsp時不支持內置容器個格式。
  • Undertow不支持jsp。

1.4 Error Handling

Spring Boot默認提供一個/error映射用來以合適的方式處理全部的錯誤,而且它在servlet容器中註冊了一個全局的 錯誤頁面。 
想要徹底替換默認行爲,能夠實現ErrorController接口,或者實現BasicErrorController類,由自定義的Controller處理錯誤。 
也能夠經過@ContorllerAdavice註解+@ExceptionHandler註解定製某個controller或exception類別要返回的JSON文檔。如:

@ControllerAdvice(basePackageClasses = FooController.class) public class FooControllerAdvice extends ResponseEntityExceptionHandler { @ExceptionHandler(YourException.class) @ResponseBody ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) { HttpStatus status = getStatus(request); return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status); } private HttpStatus getStatus(HttpServletRequest request) { Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); if (statusCode == null) { return HttpStatus.INTERNAL_SERVER_ERROR; } return HttpStatus.valueOf(statusCode); } }

2. 嵌入的servlet容器

Spring Boot支持內嵌的Tomcat, Jetty和Undertow服務器。多數開發者只須要使用合適的’Starter POM’來獲取一個徹底配置好的實例便可。默認狀況下,內嵌的服務器會在8080端口監聽HTTP請求。

2.1 將Servlets, filters, listeners註冊爲bean

全部定義爲bean的servlets,filters,listeners都將被嵌入的容器註冊。若是隻有一個servlet,它將被map到/,不然bean的名字會做爲path前綴。Filters都將map到/*。 
也可使用ServletRegistrationBean,FilterRegistrationBean and ServletListenerRegistrationBean更完整的控制。

2.2 經過註解掃描servlet, filter listener

使用嵌入式容器時,要實現@WebServlet,@WebFilter, @Weblistener的自動註冊,須要使用@ServletComponentScan。使用獨立容器時此註解無用。

2.3 Servlet Context 初始化

嵌入的servlet容器不會直接執行Servlet3.0+的javax.servlet.ServletContainerInitializer接口,或者Spring的 org.springframework.web.WebApplicationInitializer接口。這是爲了不有些被設計爲運行在war內的第三方庫會破壞sprint boot應用。獨立httpserver下實現WebApplicationInitializer便可在代碼中配置ServletContext,代替web.xml。 
若須要在spring boot應用中進行servlet context 初始化,你應該註冊一個實現了org.springframework.boot.context.embedded.ServletContextInitializer接口。

2.4 EmbeddedWebApplicationContext

此類是一種特殊的WebApplicationContext,啓動時會搜索一個EmbeddedServletContainerFactory,例如TomcatEmbeddedServletContainerFactory, JettyEmbeddedServletContainerFactory, or UndertowEmbeddedServletContainerFactory。Spring boot會自動配置這些。

2.5 配置嵌入式servlet容器

2.5.1 能夠在如application.properties文件中配置servlet容器所用的屬性

包括:

  • server.port:http監聽端口
  • server.address: 要綁定的接口地址
  • server.session.persistence: session持久化
  • server.session.timeout:session超時時間
  • server.session.store-dir:session數據的location
  • server.session.cookie.*: session-cookie配置。
  • server.error.path:error page的地址
  • server.ssl.key-store, server.ssl.key-store-password, server.ssl.key-password: ssl的配置
  • server.compression.enabled: http response壓縮
  • server.compression.min-response-size:壓縮所需的最小size,默認時2048字節
  • server.compression.mime-types:要壓縮的response content 類型。默認時text/html, text/xml, text/plain, text/css

2.5.2 也可經過實現EmbeddedServletContainerCustomizer接口在代碼中修改屬性

2.5.3 也可直接實現TomcatEmbeddedServletContainerFactory bean來配置

7、Security

1. 啓用Security

當spring security在classpath中(即引入spring-boot-starter-security pom),web應用將自動啓用安全限制,而且默認啓用basic認證。 
也可經過@EnableGlobalMethodSecurity註解添加方法級別的安全限制。

2. 配置Security

默認的AuthenticationManager有一個用戶,名爲user, 密碼會打印在log中,也可設置security.user.password屬性修改密碼。 
默認的security配置由SecurityAutoConfiguration配置類及其導入的配置類(SpringBootWebSecurityConfiguration配置web security, AuthenticationManagerConfiguration配置認證,此類在非web應用也適用)實現。 
若要徹底關閉默認的web security配置,能夠添加一個帶有@EnableWebSecurity的bean,這樣並不會關閉authentication manager配置。

@EnableWebSecurity註解使用方法 
將此註解添加到帶有@Configuration註解,而且實現了WebSecurityConfigurer接口或繼承WebSecurityConfigurerAdapter類的類上面,便可用此類替代xml設置web 
security。同時還可將配置內容放到外部屬性文件中。

若也想關閉authentication manager配置,你能夠增長一個AuthenticationManager的bean,或者經過將AuthenticationManagerBuilder注入到@Configuration類的一個方法中來配置全局的AuthenticationManager。

3. Security帶來的特性

Web應用中使用Spring Security之後,你能夠得到以下基本特性:

  • 一個帶有in-memory store的AuthenticationManager,和一個user(查看SecurityProperties.User獲取user的屬性)。
  • 通用靜態資源路徑不會被安全限制:css/, /js/, /images/* and */favicon.ico
  • 其餘部分都會應用Http Basic安全保護。
  • 安全事件都會被髮布到spring的ApplicationEventPublisher(包括認證成功,認證失敗以及拒絕訪問等)
  • Spring Security提供的常見底層特性(HSTS, XSS, CSRF, 緩存)默認都被開啓。

HSTS是什麼 
HTTP Strict Transport Security,HTTP嚴格傳輸安全。HSTS的做用是強制客戶端(如瀏覽器)使用HTTPS與服務器建立鏈接。服務器開啓HSTS的方法是,當客戶端經過HTTPS發出請求時,在服務器返回的超文本傳輸協議響應頭中包含Strict-Transport-Security字段。非加密傳輸時設置的HSTS字段無效。 
參考: http://www.chinaz.com/program/2015/0511/405146.shtml

全部上面的配置均可以經過外部屬性文件修改。想要在不改變任何其餘自動配置特性的前提下覆蓋訪問規則,能夠增長一個WebSecurityConfigurerAdapter類型的bean。

若是開啓了spring-boot-actuator,會有以下特性: 
- 即便應用路徑不受保護,被管理的路徑也會受到保護。 
- 安全相關的事件被轉換爲AuditEvents(審計事件),併發布給AuditService。 
- 默認的用戶有ADMIN和USER的角色。 
使用外部屬性可以修改Actuator(執行器)的安全特性(management.security.*)。爲了覆蓋應用程序的訪問規則,你能夠添加一個WebSecurityConfigurerAdapter類型的@Bean。同時,若是不想覆蓋執行器的訪問規則,你可使用@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)註解該bean,不然使用@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER)註解該bean。

8、使用SQL數據庫

Spring Boot項目引入spring-boot-starter-data-jpa等便可使用Spring Data與DB交互。除了spring框架提供的JdbcTemplate以及ORM,Spring Data還提供了其餘級別的功能,如建立Repository接口的實現,而後基於方法名產生queries。

1. 配置數據源

Java的javax.sql.DataSource接口提供了一個標準的使用數據庫鏈接的方法。傳統作法是,一個DataSource使用一個URL和用戶名/密碼去初始化一個數據庫鏈接。

1.1 內嵌數據庫

Spring boot支持自動配置三種in-memory的嵌入式DB:H2, HSQL,Derby。 
無需提供URL,引入以下依賴便可使用。例如,典型的pom以下:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <scope>runtime</scope> </dependency>

 

上文可使Spring Boot自動爲應用配置in-memory的hsqldb數據庫,並創建鏈接。

1.2 鏈接到一個生產環境數據庫

在生產環境中,數據庫鏈接可使用DataSource池進行自動配置。Spring boot自動配置DataSource池時的選擇順序以下:

  • 因爲Tomcat數據源鏈接池的性能和併發,在tomcat可用時,咱們老是優先使用它。
  • 若是HikariCP可用,咱們將使用它。
  • 若是Commons DBCP可用,咱們將使用它,但在生產環境不推薦使用它。
  • 最後,若是Commons DBCP2可用,咱們將使用它。

若是使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa ‘starter POMs’,你將會自動獲取對tomcat-jdbc的依賴。 
若要修改默認的數據源類型,或者指定其餘的數據源類型,能夠在application.properties中指定。 
例如:

spring.datasource.url=jdbc:mysql://localhost/test spring.datasource.username=dbuser spring.datasource.password=dbpass spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.type=xxxxxHikariCP

注:使用MySQL時要增長mysql connector的依賴。

2. 使用JdbcTemplate

Spring的JdbcTemplate和NamedParameterJdbcTemplate類將被自動配置,你能夠在本身的beans中經過@Autowire直接注入它們。 
例如:

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; @Component public class MyBean { private final JdbcTemplate jdbcTemplate; @Autowired public MyBean(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } // ... }

3. JPA和Spring Data

Spring-boot-starter-data-jpa提供以下依賴:

  • Hibernate
  • Spring Data JPA
  • Spring ORMs

3.1 Entity類

傳統上,JPA實體須要在persistence.xml中聲明。Spring boot中無需這樣,它能夠自動搜索Entity。 
默認在主配置類(標記有@EnableAutoConfiguration 或者 @SpringBootApplication)下的全部包會被搜索,而且會搜索帶有@Entity, @Embeddable 或者 @MappedSuperclass的類。

3.2 Spring Data JPA Repositories

Spring Data JPA倉庫(repositories)是用來定義訪問數據的接口。JPA會根據你的方法名自動建立查詢。好比,一個CityRepository接口可能聲明一個findAllByState(String state)方法,用來查找給定狀態的全部城市。 
繼承Repository 、CrudRepository或者PagingAndSortingRepository接口的接口即爲Spring JPA的repositories。Spring Boot會自動搜索這些接口,並經過方法名自動生成JPA queries。更復雜的查詢可藉助Spring Data的Query註解。

3.3 建立和刪除JPA db

默認狀況下,只有使用嵌入式DB(H2, HSQL或Derby)時,jpa數據庫纔會被自動建立。 
能夠經過spring.jpa.*屬性來配置jpa,例如: 
spring.jpa.hibernate.ddl-auto=create-drop可開啓自動建立和刪除表,而且默認狀況下,ApplicationContext啓動以後纔會執行DDL。 
spring.jpa.generate-ddl 也能夠用來配置生成表,可是Hibernate自動配置下,該選項不會被激活,由於Hibernate的ddl-auto屬性更適用。

9、使用NoSQL

Spring Data支持MongoDB, Neo4J, Elasticsearch, Solr, Redis, Gemfire, Couchbase 和Cassandra等NoSQL技術。 
Spring Boot能夠自動配置其中的Redis, MongoDB, Elasticsearch, Solr 和 Cassandra。其餘須要手動配置。

1. Redis

spring-boot-starter-redis自動導入依賴。Spring boot會自動配置RedisConnectionFactory, StringRedisTemplate 或者RedisTemplate。默認,這些實例會鏈接localhost:6379。 
例子:

@Component public class MyBean { private StringRedisTemplate template; @Autowired public MyBean(StringRedisTemplate template) { this.template = template; } // ... }

若是你添加一個本身的任何自動配置類型的@Bean,它將替換默認的(除了RedisTemplate的狀況,它是根據bean的名稱’redisTemplate’而不是它的類型進行排除的)。若是在classpath路徑下存在commons-pool2,默認你會得到一個鏈接池工廠。

2. MongoDB

spring-boot-starter-data-mongodb導入依賴。 
Spring boot自動配置MongoDbFactory和MongoTemplate。默認實例使用mongodb://localhost/test 
可設置如下屬性: 
spring.data.mongodb.uri (mongodb3.0) 
spring.data.mongodb.host (mongo 2.x) 
spring.data.mongodb.port 
Spring Data MongoDB也支持和Spring Data JPA同樣的Repository接口,Spring Data會根據方法名自動生成queries。

3. Solr

Apache Solr是個搜索引擎。 Sprint Boot利用Spring Data Solr爲Solr4客戶端庫提供基本的自動配置。spring-boot-starter-datasolr導入依賴。Solr5暫不支持。 
Spring Boot自動配置SolrServer,默認鏈接localhost:8983/solr 
Spring Data也爲Solr提供與JPA同樣的Repositories,只不過實體註解爲@SolrDocument。

4. Elasticsearch

Elastic Search是一個開源的,分佈式,實時搜索和分析引擎。Spring Boot利用Spring Data Elasticserach爲Elasticsearch提供基本的自動配置。spring-boot-starter-data-elasticsearch導入依賴。 
Spring boot自動配置ElasticsearchTemplate或Client實例,而且默認鏈接一個本地的內存服務器(即一個NodeClient),可設置spring.data.elasticsearch.cluster-nodes鏈接到remote server(TransportClient)。 
Spring Data也爲Elasticsearch提供與JPA同樣的Repositories,只不過實體註解爲@Document。

10、緩存

Spring 框架支持透明地爲應用添加緩存。其核心是抽象層將緩存應用到方法,減小執行次數。可使用JSR-107(JCache)註解後者水平本身的緩存註解實現緩存。 
JCache示例:

import javax.cache.annotation.CacheResult; import org.springframework.stereotype.Component; @Component public class MathService { @CacheResult public int computePiDecimal(int i) { // ... } }

Cache抽象層並不提供真實的存儲,它依賴於org.springframework.cache.Cache 和 org.springframework.cache.CacheManager提供的抽象。開啓@EnableCaching以後,SpringBoot會根據實現自動配置一個合適的CacheManager。 
spring-boot-starter-cache導入依賴。 
Spring Boot會依以下順序檢測緩存provider。

  • Generic
  • JCache (JSR-107)
  • EhCache 2.x
  • Hazelcast
  • Infinispan
  • Redis
  • Guava
  • Simple

也可以使用spring.cache.type指定使用哪種緩存。 
若由Spring Boot自動配置CacheManager, 你能夠經過實現CacheManagerCustomizer接口在cachemanager在徹底初始化之前調整其配置:

@Bean public CacheManagerCustomizer<ConcurrentMapCacheManager> cacheManagerCustomizer() { return new CacheManagerCustomizer<ConcurrentMapCacheManager>() { @Override public void customize(ConcurrentMapCacheManager cacheManager) { cacheManager.setCacheNames(Arrays.asList("one", "two")); } }; }

1. Generic (自定義Cache)

當至少自定義了一個org.springframework.cache.Cache bean時,Generic caching會被啓用,而且會配置一個CacheManager來包裝它們。

2. JCache

當javax.cache.spi.CachingProvider(這是個JSR107兼容的緩存庫)在classpath中時,JCache會被啓動。當有多個provider時,必須經過spring.cache.jcache.provider明確指定一個。還可經過spring.cache.jcache.config來指定配置文件的位置。 
有一些方法能夠定製化javax.cache.cacheManager:

  • 能夠在啓動時指定spring.cache.cache-names建立caches。也可定義javax.cache.configuration.Configuration bean去定製化。
  • org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer beans會被調用,並傳入CacheManager來定製。

3. EhCache2.x

在classpath跟路徑下若是發現了ehcache.xml,EhCache2.x會被使用。也可以使用指定spring.cache.ehcache.config=classpath:config/another-config.xml其餘文件。

4. Redis

若配置了Redis,RedisCacheManager會被自動配置。也能夠由spring.cache.cache-names指定。 
Hazelcast和Infinispan略。

5. Guava

若是Guava可用,GuavaCacheManager會被配置。也可經過spring.cache.cache-names指定。

6. Simple

若是上述選項都沒成功,一個使用ConcurrentHashMap的簡單實現會被配置爲cache store.

11、消息

Spring Framework框架爲集成消息系統提供了擴展支持:從使用JmsTemplate簡化JMS API,到實現一個完整異步消息接收的底層設施。 
Spring AMQP提供一個類似的用於’Advanced Message Queuing Protocol’的特徵集,而且Spring Boot也爲RabbitTemplate和RabbitMQ提供了自動配置選項。 
Spring WebSocket提供原生的STOMP消息支持,而且Spring Boot經過starters和一些自動配置也提供了對它的支持。

1. JMS

javax.jms.ConnectionFactory接口提供了一個標準的用於建立一個javax.jms.Connection的方法,javax.jms.Connection用於和JMS代理(broker)交互。Spring Boot爲收發消息提供了自動配置。

1.1 ActiveMQ 支持

SpringBoot檢測到ActiveMQ在classpath中可用時,會配置一個ConnectionFactory。可配置以下屬性: 
spring.activemq.broker-url=tcp://192.168.1.210:9876 
spring.activemq.user=admin 
spring.activemq.password=secret

1.2 HornetQ支持

支持的屬性有embedded,native。spring-boot-starter-hornetq導入依賴。

1.3 Artemis 支持

Apache Artemis是在2015年HornetQ被捐給Apache基金會之後創建的,全部特性和HornetQ同樣。spring-boot-starter-artemis導入依賴

2. AMQP

AMQP是一個面向消息的,平臺中立、wire-level(指的是並不是定義api和庫,而是定義會話字節流,相似http)的中間件協議。

2.1 RabbitMQ支持

RabbitMQ是輕量級,可靠的,可擴展的,輕便的基於AMQP協議的消息代理。Spring利用RabbitMQ實現AMQP協議。可經過spring.rabbitmq.*屬性組來配置,如: 
spring.rabbitmq.host=localhost 
spring.rabbitmq.port=5672 
spring.rabbitmq.username=admin 
spring.rabbitmq.password=secret 
Spring boot會自動配置AmqpTemplate,AmqpAdmin,RabbitMessagingTemplate。

12、發送郵件

Spring Boot自動配置JavaMailSender來發送郵件。spring-boot-starter-mail導入依賴。 
可經過spring.mail.*屬性組來配置。

十3、JTA處理分佈式事務

Spring Boot使用一個Atomkos或Bitronix的內嵌事務管理器來支持跨多個XA資源的分佈式JTA事務。當部署到一個恰當的J2EE應用服務器時也會支持JTA事務。 
當發現一個JTA環境時,Spring Boot將使用Spring的JtaTransactionManager來管理事務。自動配置的JMS,DataSource和JPA beans將被升級以支持XA事務。 
你可使用標準的@ransactional來參與到一個分佈式事務中。可設置ring.jta.enabled=alse來禁用JTA自動配置功能。 
spring-boot-starter-jta-atomikos和spring-boot-starter-jta-bitronix導入依賴。

十4、Spring Session

Spring Session爲管理用戶的session信息提供支持。若web應用的classpath中有spring session 和spring data redis,spring boot會經過@EnableRedisHttpSession自動配置Spring session。Session數據被存儲在redis中,超時期限可經過server.session.timeout設置。

十5、測試

spring-boot-starter-test提供如下庫: 
• spring-test提供集成測試支持 
• JUnit 
• Hamcrest—爲JUnit提供assertThat支持 
• Mockito

1. 測試Spring Boot應用

Spring Boot提供@SpringApplicationConfiguration替代spring-test標準的@ContextConfiguration註解。測試中使用@SpringApplicationConfiguration配置ApplicationContext,ApplicationContext會被SpringApplication建立,而且帶有額外的Spring boot的特性。實例:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(SampleDataJpaApplication.class)
public class CityRepositoryIntegrationTests {
@Autowired
CityRepository repository;
// ... }

 

另外加上@WebIntegrationTest 或 @WebAppConfiguration註解,會使得context loader認爲你在測試web應用。例如,爲測試類加上@WebIntegrationTest會以web應用方式啓動測試:

@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(SampleDataJpaApplication.class) @WebIntegrationTest public class CityRepositoryIntegrationTests { @Autowired CityRepository repository; RestTemplate restTemplate = new TestRestTemplate(); // ... interact with the running server }

 

可使用@WebIntegrationTest註解的server.port等屬性修改端口。例如:@WebIntegrationTest(「server.port:9000」)。若是將server.port和management.port置爲0,應用的集成測試將使用任意端口,例如:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(MyApplication.class)
@WebIntegrationTest({"server.port=0", "management.port=0"}) public class SomeIntegrationTests { // ... }

十6、Actuator(促動器):: Production-ready features

Springboot提供一些特性幫你在應用部署到生產環境後監視和管理應用。可經過HTTP,JMX甚至remote shell(SSH,Telnet)來管理和監視。審計,健康和數據採集會自動應用到你的應用。 
HTTP只有在基於Spring MVC的應用中才可用。

1. 開啓production-ready 特性

spring-boot-actuator提供Spring boot的production ready特性。 
Actuator是機器術語,指移動或控制其餘東西的機械設備。Actuator經過微小的改變產生很大的移動。 
spring-boot-starter-actuator導入依賴。

2. endpoints 端點

Actuator端點使你能夠監視應用並與之交互。Spring boot包含一些內置的端點(例如health端點),你也能夠本身增長。 
端點被暴露的方式取決於選擇的技術類型。大多應用選擇HTTP監視,這樣端點的ID被map到URL。如health端點被map到/health.

2.1 經常使用端點

ID 描述 是否敏感
actuator 爲其餘端點提供一個基於超媒體(hypermedia-based)的發現頁面。須要Spring HATEOAS支持 true
autoconfig 顯示一個auto-configuration的報告,該報告展現全部auto-configuration候選者及它們被應用或未被應用的緣由 true
beans 顯示一個應用中全部Spring Beans的完整列表 true
health 展現應用的健康信息(當使用一個未認證鏈接訪問時顯示一個簡單的’status’,使用認證鏈接訪問則顯示所有信息詳情) false
info 顯示任意的應用信息 false
dump 執行一個線程轉儲 true
mappings 顯示一個全部@RequestMapping路徑的整理列表 true
trace 顯示trace信息(默認爲最新的一些HTTP請求) true

什麼是」是否敏感」? 
取決於你如何暴露端點,敏感性能夠用做安全指示。例如,若是使用HTTP而且打開了Spring Security,那麼訪問敏感端點要求用戶名和密碼。

2.2 CORS跨域資源共享支持

Cross-origin resource sharing,是個W3C規格,它爲Web服務器定義了一種方式,容許網頁從不一樣的域訪問其資源(如字體),簡言之,CORS就是爲了讓AJAX能夠實現可控的跨域訪問而生的。Actuator的MVC端點能夠配置支持該場景:

endpoints.cors.allowed-origins=http://example.com endpoints.cors.allowed-methods=GET,POST

3. 經過HTTP監控和管理

開發Spring MVC應用時,Spring Boot Actuator會自動配置全部打開的端點,並經過HTTP暴露。默認的約定是端點id被map到url,如health到/health。

3.1 保護敏感端點

若是應用了Spring security,全部經過HTTP暴露的敏感的端點都會被保護。默認會使用基本認證(basic authentication,用戶名爲user,密碼爲應用啓動時在控制檯打印的密碼)。 
你可使用Spring屬性改變用戶名,密碼和訪問端點須要的安全角色。例如,在application.properties中添加下列配置:

security.user.name=admin security.user.password=secret management.security.role=SUPERUSER

3.2 定製管理端點的路徑

可經過以下設置爲端點的url設置前綴:

management.context-path=/manage

 

也可修改端點的id或者path來達到修改path的目的:

endpoints.health.id = fuck endpoints.health.path = /fuck/damn

3.3 定製管理服務器的端口

針對基於雲的部署,使用默認HTTP端口暴露管理端點比較明智。若是應用運行在本身的數據中心,能夠以下修改端口:

management.port=8081

通常狀況下內部應用的管理端口都被防火牆保護,不對外開放,所以能夠以下關掉保護:

management.security.enabled=false

※ 只有在啓用Spring security纔有必要明顯的關閉,不然反而可能破壞應用。

3.4 定製管理服務器地址:

management.port=8081 management.address=127.0.0.1

3.5 關掉http端點

management.port=-1

4. 度量指標Metrics

Spring Boot Actuator包括一個支持’gauge’和’counter’級別的度量指標服務。’gauge’記錄一個單一值;’counter’記錄一個增量(增長或減小)。 
全部HTTP請求的度量指標都會被自動記錄,經過metrics端點(/metrics)便可訪問。

4.1 系統度量指標

Spring Boot暴露如下系統指標: 
系統內存總量(mem),單位:Kb 
空閒內存數量(mem.free),單位:Kb 
處理器數量(processors) 
系統正常運行時間(uptime),單位:毫秒 
應用上下文(就是一個應用實例)正常運行時間(instance.uptime),單位:毫秒 
系統平均負載(systemload.average) 
堆信息(heap,heap.committed,heap.init,heap.used),單位:Kb 
線程信息(threads,thread.peak,thead.daemon) 
類加載信息(classes,classes.loaded,classes.unloaded) 
垃圾收集信息(gc.xxx.count, gc.xxx.time)

4.2 數據源指標

如下指標會被暴露(前綴都是datasource.): 
活躍鏈接數(datasource.xxx.active) 
當前鏈接池使用率(datasource.xxx.usage)

4.3 緩存指標

如下指標會被暴露: 
當前cache大小(cache.xxx.size) 
命中率(cache.xxx.hit.ratio) 
未命中率(cache.xxx.miss.ratio)

4.4 tomcat session指標

若使用tomcat作嵌入的servlet容器,session指標會被暴露: 
活躍session數:httpsessions.active 
最大session數:httpsessions.max

十7、部署SpringBoot應用

Spring Boot靈活的打包選項幫你更容易的將Spring Boot 應用部署到雲平臺,容器鏡像,虛擬機或者實體機。

1. 部署到雲

Spring Boot的可執行jar包能夠部署到大多數流行的PaaS(Platform as a service)雲提供者。這些雲提供者要求使用者「帶好本身的容器」;而它們管理應用進程。因此它們須要一些中間層來將你的應用適配到雲概念中的一個運行進程。 
兩個流行的雲提供者,Heroku和Cloud Foundry,採起一種「buildpack」方式。Buildpack將你部署的代碼打包進任何啓動應用所需的包裏:多是個JDK和一個java調用,多是一個嵌入式web服務器,也多是一個完整的應用服務器。一個buildpack是可插拔的,但你最好儘量少的對它進行自定義設置。這能夠減小不受你控制的功能範圍,並最小化開發和生產環境的差異。 
理想狀況下,你的應用好比一個Spring boot可執行jar包,應含有它運行所需的一切。 
還有OpenShift, Boxfuse和Amazon Web Service也支持Spring boot jar的部署 
Goole App Engine只支持Servlet 2.5,要部署Springboot應用須要作修改。

2. 安裝Spring Boot 應用。

除了使用jar –jar運行可執行jar包,還能夠編譯成Unix上的徹底可執行應用:

<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> </plugin>

CentOS和Ubuntu上都已支持此功能。這樣就可將應用以unix/Linux service的方式啓動。

參考連接

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/

相關文章
相關標籤/搜索