Spring Boot In Practice (0):基礎

Spring Boot儼然已經成爲Java Web的開發標準,可是使用上發現千人千面,這裏整理了一些在使用Spring Boot使用中常見的狀況,但願做爲一個小小的Guideline來幫助項目中同事統一用法,也包含了一些小小的Best Practices。javascript

可能內容並不太適合Spring Boot的初學者或者對Spring還很陌生的讀者。php

I. Prerequisites

咱們項目中使用Spring Boot的基本準則是:html

  1. 配置最小化,通用配置儘可能採用Spring Boot的自動配置(auto configuration),經過Spring Boot推薦的方式來完成配置的自定義。
  2. 儘可能採用Java-based配置的方式(這一點只是我的偏好而已)。
  3. 儘可能採用Spring Boot推薦的包結構。
  1. 本系列採用的Spring Boot版本爲:1.5.3.RELEASE
  2. JDK 版本 1.8 or later;
  3. Maven 3.0+;
  4. 開發工具推薦 IntelliJ IDEA(Community版便可);

II. 依賴管理

Spring Boot推薦使用spring-boot-starter-parent做爲項目的POM的Parent,不過咱們的項目推薦使用的是Spring IO Platformjava

<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

III. 選擇合適的starter

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

IV. 合理的Package Structure

假設咱們的項目是一箇中等項目,並無採用流行的微服務架構,而是包含多個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路徑。

V. 配置文件及Profiles

推薦使用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

VI. 日誌處理

浩瀚的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採用不一樣的日誌配置。

VII. 參考

Using Logback with Spring Boot - Spring Framework Guru

相關文章
相關標籤/搜索