Spring Boot儼然已經成爲Java Web的開發標準,可是使用上發現千人千面,這裏整理了一些在使用Spring Boot使用中常見的狀況,但願做爲一個小小的Guideline來幫助項目中同事統一用法,也包含了一些小小的Best Practices。javascript
可能內容並不太適合Spring Boot的初學者或者對Spring還很陌生的讀者。php
咱們項目中使用Spring Boot的基本準則是:html
- 本系列採用的Spring Boot版本爲:1.5.3.RELEASE;
- JDK 版本 1.8 or later;
- Maven 3.0+;
- 開發工具推薦 IntelliJ IDEA(Community版便可);
Spring Boot推薦使用spring-boot-starter-parent
做爲項目的POM的Parent,不過咱們的項目推薦使用的是Spring IO Platform:java
<parent>
<groupId>io.spring.platform</groupId>
<artifactId>platform-bom</artifactId>
<version>Brussels-SR2</version>
</parent>複製代碼
Spring IO Platform包含了Spring模塊和大量的第三庫版本(能夠查看這些庫的版本),都是通過測試能夠完美工做的。mysql
事實上,若是是查看一下Spring IO Platform POM文件,會發現他繼承了spring-boot-starter-parent
,因此說通常狀況下你基於Spring Boot的項目能夠直接用Spring IO Platform做爲parent。由於Spring IO Platform提供了spring-boot-starter-parent
的超集,包含了許多spring-boot-starter-parent
中沒有提供的依賴,好比com.google.protobuf
等。git
Starter應該是Spring Boot提供的最大便利了,其提供了某個feature所需依賴的配置和自動配置相關Bean的服務。例如spring-boot-starter-data-redis
,會幫咱們自動引入jedis等依賴,而且提供開箱即用的RedisConnectionFactory
, StringRedisTemplate
, RedisTemplate
實例。程序員
除了官方提供的starter,還有許多第三方starter能幫咱們節省很大的精力,好比mybatis-spring-boot-starter
讓咱們不用再關心mybatis的依賴引入和配置,pagehelper-spring-boot-starter
讓咱們一行代碼搞定翻頁。github
假設咱們的項目是一箇中等項目,並無採用流行的微服務架構,而是包含多個modules,例如:web
└── service-lib //包含entity、dao、service等基礎業務代碼
└── api //依賴於service-lib,提供REST API
└── tasks //依賴於service-lib,運行一些Scheduled tasks複製代碼
其中service-lib的包結構大體以下:redis
src/main/java/
└── com
└── bytecho
└── sample
└── lib
├── ServiceLibraryConfig.java ❶
├── mappers
├── models
├── services
└── utils複製代碼
❶ ServiceLibraryConfig
內容:
@Configuration
@EnableAsync
@EnableCaching(proxyTargetClass = true)
public class ServiceLibraryConfig {
@Bean
public RedisTemplate<Object, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
//省略
return template;
}
//...各類配置
}複製代碼
api module包結構以下:
src/main/java/
└── com
└── bytecho
└── sample
├── APIWebServer.java
└── web
├── advices
├── controllers
├── ...複製代碼
APIWebServer
的內容:
@SpringBootApplication
public class APIWebServer {
public static void main( String[] args ) {
SpringApplication.run(APIWebServer.class, args);
}
}複製代碼
@SpringBootApplication
這個註解,咱們都知道其等價於三個註解@Configuration
、@EnableAutoConfiguration
、@ComponentScan
,
因爲註解標註的類APIWebServer
位於package:com.bytecho.sample
下,@ComponentScan
會幫助咱們自動掃描這個包下全部的Component、Services以及Configuration,因此service-lib這個項目下全部的組件都會放到相應context裏,不用咱們再顯式的去@Import(ServiceLibraryConfig.class)
,也不用再去聲明component scan須要掃描的package路徑。
推薦使用Multi-profile YAML documents,即各環境配置放在同一配置文件application.yml
中。
spring:
profiles:
active: dev
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
hikari:
connection-timeout: 10000 #10 sec
maximum-pool-size: 15
---
spring:
profiles: dev
datasource:
url: jdbc:mysql://127.0.0.1:3306/bytecho?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
username: bytecho
password: bytecho111
redis:
host: 127.0.0.1
port: 17500
password: bytecho111
---
spring:
profiles: staging
datasource:
url: jdbc:mysql://10.10.11.11:3306/bytecho?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
username: bytecho_test
password: bytecho_test
redis:
host: 10.10.11.11
port: 17500
password: bytecho_test
---
spring:
profiles: production
#省略複製代碼
簡單的項目這樣作比較一目瞭然,啓動的時候經過命令行參數指定當前profile:--spring.profiles.active=prod
浩瀚的Java世界裏有爲數衆多的Logging框架,因而勤勞的Java程序員們又發明了不一樣的Logging Facade代理底層的Logging框架來解耦(設計模式的使用真是爐火純青)。
Spring Boot底層使用Commons Logging做爲Facade。若是引入了starter(全部starter依賴於spring-boot-starter-logging),Spring Boot默認會使用底層日誌框架爲Logback。
簡單的配置能夠直接在application.properties
(application.yml
)中完成:
logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.com.bytecho.sample=DEBUG
logging.file=/opt/logs/api.log複製代碼
固然爲了減少application.properties
的體積和更大的定製性,咱們使用推薦的logback-spring.xml
來完成對Logback的配置,代碼中使用SLF4J做爲facade。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" /> ❶
<property name="LOG_FILE" value="${LOG_FILE:-/opt/logs/sample.log}"/> ❷
<include resource="org/springframework/boot/logging/logback/console-appender.xml" /> ❸
<springProfile name="dev"> ❹
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
<logger name="com.bytecho.sample" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
</springProfile>
<springProfile name="staging,production"> ❺
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d{yyyyMMdd}</fileNamePattern>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<root level="WARN">
<appender-ref ref="FILE" />
</root>
<logger name="com.bytecho.sample" level="INFO" additivity="false">
<appender-ref ref="FILE" />
</logger>
</springProfile>
</configuration>複製代碼
❶ 這裏引入Spring Boot自帶的一些配置:默認的Log Pattern,一些第三方庫默認的日誌級別等;
❷ 注意這裏${variable:-defaultValue}
的形式是Logback本身的Variable Substitution,LOG_FILE來自於Spring Environment中的logging.file,你能夠在application.properties中配置,Spring Boot幫你把該值放入了System properties,若是沒有,取默認值/opt/logs/sample.log
;
❸ 默認的console-appender,也能夠參考這個文件內容本身來配置;
❹和❺爲Spring Boot對Logback的擴展,支持對不一樣profile採用不一樣的日誌配置。