zoukankan      html  css  js  c++  java
  • 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可以与属性源协同使用,从而激活不同的配置
  • 相关阅读:
    MySQL的备份和恢复-mysqldump
    MySQL日志功能详解
    MySQL查询缓存
    MySQL的用户管理
    doc常用命令
    记录mysql语句
    centos常用命令
    centos 7.6
    centos6 常用命令
    centos6.8 安装软件
  • 原文地址:https://www.cnblogs.com/AganRun/p/13195462.html
Copyright © 2011-2022 走看看