乐趣区

Springboot快速上手-第四篇-自定义配置

1: 概述

Spring Boot 支持根据应用的实际需要,进行自定义配置,Spring Boot 能从多种属性源获得属性,包括如下几处:

2: 可调整的属性

对于 Spring Boot 自动配置的 Bean,目前提供了上千个用于微调的属性。
具体的可以参看官方文档:
https://docs.spring.io/spring-boot/docs/2.0.0.M4/reference/htmlsingle/#common-application-properties

3: 自定义属性

Spring Boot 允许使用 properties 文件、yml 文件或者命令行参数作为外部配置,并提供自定义属性的支持。比如我们可以在 application.properties 配置一些常量,例如:

cc.add.k1=k1vv
cc.add.k2=k222

然后直接在要使用的地方通过注解 @Value(value=”${config.name}”)就可以绑定到你想要的属性上面

  • 1:使用 @Value 注解,可以直接将属性值注入到你的 beans 中,也可以通过 Spring 的 Environment 抽象或绑定到结构化对象来访问。
  • 2:如果属性太多了,一个个绑定到属性字段上太累,官方提倡绑定一个对象的 bean,比如:这里我们建一个 ConfigBean.java 类,顶部需要使用注解 @ConfigurationProperties(prefix =“cc.add”)来指明使用哪个,示例如下:
@ConfigurationProperties(prefix="cc.add")
public class SysConf {
   private String k1;
   private String k2;
  // 省略 getter 和 setter
}
  • 3:然后在启动类上添加:
 @EnableConfigurationProperties({SysConf.class})
  • 4:然后就可以在要使用的类里面直接注入了:
@Autowired
private SysConf sc;

5:也可以使用

 @Autowired
 private Environment env;

然后用 env.getProperty(“cc.add.k1”)去访问

4: 参数间引用

在 application.properties 中的各个参数之间也可以直接引用来使用,使用 ${paramID},如:

 cc.add.k1=k1vv
 cc.add.k2=k222-${cc.add.k1}

5: 使用自定义配置文件

有时候我们不希望把所有配置都放在 application.properties 里面,这时候我们可以另外定义一个,比如:my.properties,形如:

cc.add.k3=k3vv
cc.add.k4=k444-${cc.add.k1}

1:然后再写一个配置 bean,形如:

@Configuration
@ConfigurationProperties(prefix = "cc.add") 
@PropertySource("classpath:my.properties")
public class MyConf {
   private String k3;
   private String k4;
}

由于配置了 @Configuration,因此不用在启动类中添加了

2:使用方法跟前面使用属性配置类 SysConf 是一样的

6: 配置随机值

可以使用 ${random} 可以用来生成各种不同类型的随机值,例如:

${random.value}
${random.int}
${random.long}
${random.uuid}
${random.int(5)}
${random.int[5,10]}

7: 配置文件的放置位置

自定义的配置文件,有多个可以放置的位置:

(1)外置,在相对于应用程序运行目录的 /config 子目录里
(2)外置,在应用程序运行的目录里
(3)内置,在 config 包内
(4)内置,在 Classpath 根目录

1:这个列表按照优先级排序。也就是说,/config 子目录里的 application.properties 会覆盖应用程序 Classpath 里的 application.properties 中的相同属性。

2:此外,如果你在同一优先级位置同时有 application.properties 和 application.yml,那么 application.properties 里的属性会覆盖 application.yml 里的属性(有资料说的相反)

微调自动配置示例
简单的给出几个微调自动配置的例子,以学习微调的方法。
1:配置嵌入式服务器端口,形如:server.port=9080
配置上下文路径,形如:server.context-path=/myweb

8: 配置日志

默认情况下,Spring Boot 会用 Logback 来记录日志,并用 INFO 级别输出到控制台。一般来说,你不需要切换日志实现;Logback 能很好地满足你的需要。

1:如果决定使用 Log4j 或者 Log4j2,那么你只需要修改依赖,引入对应该日志实现的起步依赖,同时排除掉 Logback。
以 Maven 为例,应排除掉根起步依赖传递引入的默认日志起步依赖,这样就能排除 Logback 了,形如:

 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2:通常对日志配置最常做的改动就是修改日志级别和指定日志输出的文件。使用了 Spring Boot 的配置属性后,可以在不创建 logback.xml 文件的情况下修改那些配置。

在 application.properties 里设置:

 logging.path=/var/logs/
 logging.file=my.log
 logging.level.root=WARN
 logging.level.root.org.springframework.security=DEBUG

3:假设应用程序有 /var/logs/ 的写权限,日志就能被写入 /var/logs/my.log。默认情况下,日志文件的大小达到 10MB 时会切分一次。

4:要完全掌握日志配置,可以在 Classpath 的根目录 (src/main/resources) 里创建 logback.xml 文 件。下面是一个 logback.xml 的简单例子:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
              <pattern>
            %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        </pattern>
        </encoder>
    </appender>
    <logger name="root" level="INFO"/>
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

5:由于日志是在 ApplicationContext 被创建之前初始化, 所以不可能在 Spring 的 @Configuration 文件中, 通过系统属性和传统的外部配置文件来进行调整。

9: 使用 profile

1:遵循 application-{profile}. properties/yml 这种命名格式,这样就能提供特定于 Profile 的属性了。形如:

 application-dev.properties
 application-test.properties

2:在 application.properties 中使用 spring.profiles.active 属性来设置具体要使用哪一个 profile

(1)可以启动多个 profile,如:

 spring.profiles.active=test,testConf

(2)还可以用 spring.profiles.include 来叠加 profile

 spring.profiles.include=test,testConf

3:可以用 profile 的配置文件来分区配置我们的环境变量,在类里,还可以直接用 @Profile 注解来进行配置

(1)定义配置用的接口,如:

public interface MyProfile {String getDBConf();
}

(2)实现配置接口,如:

@Component
@Profile("devConf")
public class Dev implements MyProfile {public String getDBConf() {return "devDB";}
}

@Component
@Profile("testConf")
public class ForTest implements MyProfile{public String getDBConf() {return "testDB";}
}

(3)在 properties 配置文件中配置:

 spring.profiles.include=test,devConf

(4)在需要获取配置的类里面就可以直接注入来使用了,如:

 @Autowiredprivate
 MyProfile mp;

退出移动版