Spring Boot In Practice (0):基础

Spring Boot俨然已经成为Java Web的开发标准,但是使用上发现千人千面,这里整理了一些在使用Spring Boot使用中常见的情况,希望作为一个小小的Guideline来帮助项目中同事统一用法,也包含了一些小小的Best Practices。

可能内容并不太适合Spring Boot的初学者或者对Spring还很陌生的读者。

I. Prerequisites

我们项目中使用Spring Boot的基本准则是:

  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 Platform

<parent>
    <groupId>io.spring.platform</groupId>
    <artifactId>platform-bom</artifactId>
    <version>Brussels-SR2</version>
</parent>复制代码

Spring IO Platform包含了Spring模块和大量的第三库版本(可以查看这些库的版本),都是经过测试可以完美工作的。

事实上,如果是查看一下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等。

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让我们一行代码搞定翻页。

IV. 合理的Package Structure

假设我们的项目是一个中等项目,并没有采用流行的微服务架构,而是包含多个modules,例如:

└── service-lib //包含entity、dao、service等基础业务代码
└── api //依赖于service-lib,提供REST API
└── tasks //依赖于service-lib,运行一些Scheduled tasks复制代码

其中service-lib的包结构大致如下:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值