SpringInAction第五章总结 使用配置属性

项目源码位置 https://github.com/AganRun/SpringInAction

第五章 使用配置属性

5.1 细粒度的自动配置

带有@Bean注解的方法一般会同时初始化Bean并立即为它的属性设置值。

Spring获取属性源的方式有:
https://github.com/AganRun/SpringInAction/blob/master/Resource/5-1.png?raw=true

举个栗子:
想要把端口设置为8080

  1. 在application.properties/yml中加入server.port属性
  2. 运行jar包时命令行参数
    $ java -jar tacocloud.jar --server.port=8080
  3. 声明环境变量
    export SERVER_PORT=8080

配置数据源

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/spring-action-jpa
    username: postgres
    password: 123456
    driver-class-name: org.postgresql.Driver

如果存在连接池,会自动使用配置的数据源

如果想让程序启动时执行数据库SQL,可以配置
spring.datasource.schemaspring.datasourcce.data属性

spring:
  datasource:
    schema:
      - order-schema.sql

配置嵌入式服务器

  1. 端口号
    如果server.port属性被设置为了0,服务器选择任选一个可用的端口,保证并发运行的测试不会与硬编码的端口号冲突。
  2. HTTPS

可以使用JDK的keytool命令行工具生成keystore

keytool -keystore mykeys.jks -genkey -alias tomcat -keyalg RSA

过程中出了密码,其余无关紧要,比如使用letmein作为密码,则在配置文件中使用如配置

server:
  ssl:
    key-store: mykeys.jks
    key-store-password: letmain
    key-password: letmain

配置日志

默认情况下,SpringBoot通过Logback配置日志,日志会以INFO级别写入控制台。
可以加入logback的xml文件后,在配置文件中声明

以下是logback的内容(控制台和文件同时打印+JPA的SQL打印)

<configuration debug="false">
    <!-- 应用名称 -->
    <property name="APP_NAME" value="logTest" />
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="${log.dir:-logs}/${APP_NAME}" />
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg  %n</pattern>
        </encoder>
    </appender>
    <!-- 按照每天生成日志文件 -->
    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/runtime.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <!-- each file should be at most 5MB, keep 30 days worth of history, but at most 100MB -->
            <maxFileSize>5MB</maxFileSize>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <totalSizeCap>100MB</totalSizeCap>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 1. 输出SQL 到控制台和文件-->
    <logger name="org.hibernate.SQL" additivity="false" >
        <level value="DEBUG" />
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT" />
    </logger>

    <!-- 2. 输出SQL 的参数到控制台和文件-->
    <logger name="org.hibernate.type.descriptor.sql.BasicBinder" additivity="false" level="TRACE" >
        <level value="TRACE" />
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT" />
    </logger>

    <root level="info">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

Spring配置文件加入如下配置

spring:
  # 打印SQL
    show-sql: true
# 配置日志
logging:
  config: classpath:logback.xml

如果只是简易版,可以直接在配置文件中配置

logging:
  path: /var/logs/
  file: TacoCloud.log
  level:
    root: WARN

将日志写入/var/logs/TacoCloud.log文件,默认日志文件达到10MB轮换。

5.2 自定义配置属性

需求:用户订单列表接口的分页大小,由配置文件给出

  1. 先在配置文件中加入pageSize配置
    taco: 
      orders: 
        pageSize: 20
    
  2. 加入@ConfigurationProperties
    //@ConfigurationProperties(prefix = "taco.orders")
    public class OrderController {
        private int pageSize = 20;
        public void setPageSize(int pageSize) {
            this.pageSize = pageSize;
        }
    
    一般,特定的配置细节会从控制器和其他应用程序中抽离出来
  3. 通用的配置类,提升复用性
    @Component
    @Data
    @ConfigurationProperties(prefix = "taco.orders")
    public class OrderProperties {
        private int pageSize = 20;
    }
    
    其他类注入OrderProperties即可

声明配置属性元数据

在IDEA等编辑器中,发现自定义的配置属性会被提示unknown property 'taco'

消除警告的方法就是创建自定义配置属性的元数据。在META-INF下创建一个名为additional-spring-configuration-metadata.json的文件
这个操作可以通过编辑器快捷操作完成。

{
  "properties": [
    {
      "name": "taco.orders.pageSize",
      "type": "java.lang.String",
      "description": "Description for taco.orders.pageSize."
    }
  ]
}

5.3 使用Profile进行配置

需求:应用部署到不同的环境上,通常配置的细节有不同。比如数据库、日志级别

可以使用SpringProfile。profile是一种条件化的配置,可以觉得运行时哪些profile处于激活状态。可以使用或忽略不同的bean、配置类和配置属性

  1. 定义特定的profile属性
  • 可以创建不同的配置文件,遵循application-{profile}.properties/yml的方式
    例如:application-dev.yml、application-prod.yml
  • 也可以定义相关属性。(仅适用于yaml配置)
    logging:                # 没有配置profile属性代表通用
      level:
        tacos: DEBUG    
    ---                     # 通过三个中划线分割不同的profile
    spring:
      profile: prod         # 代表这是prod环境
    logging:
      level:
        tacos: WARN
    
  1. 激活profile
  • 配置application.yml
    spring:
      profiles: 
        active: 
          - prod
    
    但是这个可能是最糟糕的方式
  • 环境变量的方式(推荐)
    export SPRING_PROFILES_ACTIVE=prod
  • 命令行的方式
    java jar -taco-cloud.jar --spring.profiles.active=prod

可以同时激活多个profile,配置文件可以另起一行,命令行用逗号分隔

5.3.3 使用Profile条件化创建Bean

可以通过@Profile注解将某些Bean设置到指定的profile。这是几种写法。

@Profile("dev")
@Profile({"dev", "qa"})
@Profile("!prod")

第五章总结

  • 可添加@ConfigurationProperties,从多个属性源获取配置
  • 配置属性来源有命令行参数、环境变量、JVM系统属性、属性文件、YAML文件等
  • 配置属性可以覆盖自动配置的设置,例如数据源URL
  • Profile可以与属性源协同使用,从而激活不同的配置
posted @ 2020-06-26 16:48  浮梦  阅读(267)  评论(0编辑  收藏  举报