一、導覽
本文主要按以下模塊介紹spring Boot(1.4.2.RELEASE)提供的特性,
SpringApplication類
外部化配置
Profiles
日志
開發WEB應用
Security
使用SQL
使用NoSQL
快取
訊息
發送郵件
JTA處理分布式事務
Spring Session
測驗
Actuator
部署
二、SpringApplication類
在主類——即帶有@SpringBootApplication注解類,的main方法里呼叫SpringApplication.run(應用的Configration配置類.class,引數串列) 會啟動spring應用,默認log級別是INFO,會顯示一些相關的啟動詳情,比如啟動應用的用戶等,
- 使用SpringApplicationBuilder類可以創建分層的
ApplicationContext
new SpringApplicationBuilder()
.bannerMode(Banner.Mode.OFF)
.sources(Parent.class)
.child(Application.class)
.run(args);
- 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被發送,
-
web環境
SpringApplication會根據應用是否為web來創建不同的ApplicationContext: AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext,
可以呼叫setWebEnvironment(boolean webEnvironment)復寫默認實作(在junit測驗時置為false最好),更可以使用setApplicationContextClass(…).完全控制ApplicationContext的創建, -
在SpringApplication.run完成前執行特定代碼
使用ApplicationRunner或CommandLineRunner,并配合Order注解指定呼叫順序,
CommandLineRunner的run(String …args)方法直接訪問SpringApplication.run傳遞的引數,ApplicationRunner的run方法則使用ApplicationArguments訪問引數,例如:
import org.springframework.boot.*
import org.springframework.stereotype.*
@Component
public class MyBean implements CommandLineRunner {
public void run(String... args) {
// Do something...
}
}
三、外部化配置
- 如何參考配置的屬性
可使用properties檔案,YAML檔案,環境變數,命令列引數(如 –name=”fuck”)來外部化配置,屬性值可以使用@Value注解直接注入到bean中,并通過Spring的Environment抽象或經過@ ConfigurationProperties 注解系結到結構化物件來訪問,
示例:
YAML檔案:
yml 屬性
或者等效的properties檔案:
properties屬性
使用@Value注入單個屬性:
單個屬性
使用@ ConfigurationProperties注入屬性族:
屬性組
※ 注意里面使用了JSR-303注解來校驗屬性值,
@ ConfigurationProperties還可以用到@Bean注解的方法上,
bean定義
- 屬性加載順序
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設定的默認屬性
YAML是JSON的超集,非常適合定義層級化配置資料,引入SnakeYAML庫會使SpringApplication類自動支持YAML,使用spring-boot-starter會自動引入YAML,
四、Profiles
Spring Profiles提供了一種隔離應用程式配置的方式,并讓這些配置只能在特定的環境下生效,
- 如何配置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
五、日志
Spring Boot內部日志使用Commons Logging,但是開發底層日志實作,會為Java Util Logging, Log4j, Log4j2和Logback提供默認配置,不論哪種配置,loggers都被預配置為使用console輸出,并提供一個可選的檔案輸出,
默認情況下,如果是使用’Starter POMs’,Logback將被用作日志實作,
- 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
1
2
3
1
2
3
顯示以下內容:
日期和時間—毫秒精度,利于排序
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),
- 檔案輸出
默認,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
- 自定義日志配置
將相應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可能會導致類加載問題,不推薦使用,
- Logback擴展
Spring Boot為Logback提供了一些高級配置屬性,可以在logback-spring.xml中使用,
注意
不能再logback.xml中使用,因為此檔案加載的太早,要么在logback-spring.xml中使用,要么定義logging.confi屬性,
6.1 Profile特定的配置
例如:
6.2 Environment屬性
例如:
六、開發web應用
Spring Boot非常適合開發web應用,你可以使用內嵌的Tomcat,Jetty或Undertow輕松創建一個HTTP服務器,大多數的web應用都使用spring-boot-starter-web模塊進行快速搭建和運行,
- 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來配置
七、Security
-
啟用Security
當spring security在classpath中(即引入spring-boot-starter-security pom),web應用將自動啟用安全限制,并且默認啟用basic認證,
也可通過@EnableGlobalMethodSecurity注解添加方法級別的安全限制, -
配置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,
- 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,
八、使用SQL資料庫
Spring Boot專案引入spring-boot-starter-data-jpa等即可使用Spring Data與DB互動,除了spring框架提供的JdbcTemplate以及ORM,Spring Data還提供了其他級別的功能,如創建Repository介面的實作,然后基于方法名產生queries,
- 配置資料源
Java的javax.sql.DataSource介面提供了一個標準的使用資料庫連接的方法,傳統做法是,一個DataSource使用一個URL和用戶名/密碼去初始化一個資料庫連接,
1.1 內嵌資料庫
Spring boot支持自動配置三種in-memory的嵌入式DB:H2, HSQL,Derby,
無需提供URL,引入如下依賴即可使用,例如,典型的pom如下:
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的依賴,
- 使用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;
}
- 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屬性更適用,
九、使用NoSQL
Spring Data支持MongoDB, Neo4J, Elasticsearch, Solr, Redis, Gemfire, Couchbase 和Cassandra等NoSQL技術,
Spring Boot可以自動配置其中的Redis, MongoDB, Elasticsearch, Solr 和 Cassandra,其他需要手動配置,
- 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,默認你會獲得一個連接池工廠,
-
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, -
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, -
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,
十、快取
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
return new CacheManagerCustomizer
@Override
public void customize(ConcurrentMapCacheManager cacheManager) {
cacheManager.setCacheNames(Arrays.asList("one", "two"));
}
};
}
-
Generic (自定義Cache)
當至少自定義了一個org.springframework.cache.Cache bean時,Generic caching會被啟用,并且會配置一個CacheManager來包裝它們, -
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其他檔案,
-
Redis
若配置了Redis,RedisCacheManager會被自動配置,也可以由spring.cache.cache-names指定,
Hazelcast和Infinispan略, -
Guava
如果Guava可用,GuavaCacheManager會被配置,也可通過spring.cache.cache-names指定, -
Simple
如果上述選項都沒成功,一個使用ConcurrentHashMap的簡單實作會被配置為cache store.
十一、訊息
Spring Framework框架為集成訊息系統提供了擴展支持:從使用JmsTemplate簡化JMS API,到實作一個完整異步訊息接收的底層設施,
Spring AMQP提供一個相似的用于’Advanced Message Queuing Protocol’的特征集,并且Spring Boot也為RabbitTemplate和RabbitMQ提供了自動配置選項,
Spring WebSocket提供原生的STOMP訊息支持,并且Spring Boot通過starters和一些自動配置也提供了對它的支持,
- 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匯入依賴
- 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,
十二、發送郵件
Spring Boot自動配置JavaMailSender來發送郵件,spring-boot-starter-mail匯入依賴,
可通過spring.mail.*屬性組來配置,
十三、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匯入依賴,
十四、Spring Session
Spring Session為管理用戶的session資訊提供支持,若web應用的classpath中有spring session 和spring data redis,spring boot會通過@EnableRedisHttpSession自動配置Spring session,Session資料被存盤在redis中,超時期限可通過server.session.timeout設定,
十五、測驗
spring-boot-starter-test提供以下庫:
? spring-test提供集成測驗支持
? JUnit
? Hamcrest—為JUnit提供assertThat支持
? Mockito
- 測驗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 {
// ...
}
十六、Actuator(促動器):: Production-ready features
Springboot提供一些特性幫你在應用部署到生產環境后監視和管理應用,可通過HTTP,JMX甚至remote shell(SSH,Telnet)來管理和監視,審計,健康和資料采集會自動應用到你的應用,
HTTP只有在基于Spring MVC的應用中才可用,
-
開啟production-ready 特性
spring-boot-actuator提供Spring boot的production ready特性,
Actuator是機器術語,指移動或控制其他東西的機械設備,Actuator通過微小的改變產生很大的移動,
spring-boot-starter-actuator匯入依賴, -
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
- 通過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
1
1
也可修改端點的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
- 度量指標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
十七、部署SpringBoot應用
Spring Boot靈活的打包選項幫你更容易的將Spring Boot 應用部署到云平臺,容器鏡像,虛擬機或者物體機,
-
部署到云
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應用需要做修改, -
安裝Spring Boot 應用,
除了使用jar –jar運行可執行jar包,還可以編譯成Unix上的完全可執行應用:
CentOS和Ubuntu上都已支持此功能,這樣就可將應用以unix/Linux service的方式啟動,
參考鏈接
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/
歡迎關注 Java架構師社區公眾號.
本文轉載自Java架構師必看 ,更多內容點擊查看!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/165332.html
標籤:Java
