SpringBoot 配置文件

SpringBoot 配置文件

yaml(YAML Ain’t Markup Language)

语言文件, 已数据为中心, 比json, xml等 更适合做配置文件

yaml语法

配置端口号为80;

server:
  port: 80
  # 项目访问路径
  context-path:/

1. 基本语法

属性和值区分大小写

key: value : 表示一对键值对(空格必须有);

以空格的缩进控制层级关系, 只要是左对齐的一列数据都是同一层级

server:
	prot:80
	path: /hello

2. 值的写法

字面量: 普通的值(数字, 字符串, 布尔)
  • k: v

    • 字符串默认不加单引号或双引号

    • "":双引号; 不会转义字符串中的特殊字符, 特殊字符会作为本身想表示的意思

      name: "zhangshan\nlisi" --- 张三	换行	李四
      
    • '': 单引号; 会转义特殊字符, 特殊字符最终只是一个普通字符串数据

      name: 'zhangshan\nlisi' --- 张三\n李四
      
对象 / Map (属性和值)(键值对):
  • k: v

    • 对象 / Map

      # 普通写法
      people:
      	name: zhangsan
      	age: 20
      # 行内写法
      user: {username: zhangsan, age: 20}
      
数组(List / Set):
  • - 值表示数组中的一个元素

    # 普通写法
    pets:
    	- cat
    	- dog
    	- pig
    
    # 行内写法
    pets: [cat,dog,pig]
    

3. 配置文件的占位符

  1. 随机数

    ${random.value}
    ${random.int}
    ${random.long}
    ${random.int(10)}
    ${random.int[1024, 65536]}
    
  2. 占位符

    获取之前配置的值, 如果没有可以使用:指定默认值

    person.dog.age=${person.ages:10}
    


配置文件值注入

yaml配置文件编写

person:
  name: harlan
  age: 24
  sex: true
  birth: 1997/11/17
  map: {k1: v1, k2: v2, k3: v3}
  list:
    - first
    - secound
    - three
    - four
    - five
  dog:
    name: doudou
    age: 2

domain编写:

@Component
@ConfigurationProperties(prefix = "person")
public class Person {

    private String name;
    private Integer age;
    private Boolean sex;
    private Date birth;
    private Map<String, Object> map;
    private List<Object> list;
    private Dog dog;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Boolean getSex() {
        return sex;
    }

    public void setSex(Boolean sex) {
        this.sex = sex;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Map<String, Object> getMap() {
        return map;
    }

    public void setMap(Map<String, Object> map) {
        this.map = map;
    }

    public List<Object> getList() {
        return list;
    }

    public void setList(List<Object> list) {
        this.list = list;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }
}

需要在domain中添加@ConfugurationProperties注解, 并指定前缀, 然后使用@Component注解添加到Spring容器中

注意:同时我们可以在pom中导入配置文件处理器, 使得编写yaml配置时有提示信息

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-configuration-processor</artifactId>
   <optional>true</optional>
</dependency>

使用application.proties配置

person.name=harlan
person.age=23
person.birth=1997/11/17
person.list=a,b,c
person.map.k1=v1
p erson.map.k2=v2
person.sex=true

@Value获取值和@ConfigurationProperties获取值比较

如果说, 欧美只是在某个业务逻辑中需要获取一下配置文件中的某项值, 使用@Value注解

@ConfigurationProperties@Value
功能批量注入配置文件中的属性一个一个指定
松散绑定(松散语法)支持不支持
SpEL不支持支持
JSR303数据校验(@Validated)支持不支持
复杂类型封装支持不支持

@Validated数据校验

需要导入数据校验场景依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

在需要校验的属性上添加校验注解

@Component
@Validated
@ConfigurationProperties(prefix = "person")
public class Person {

    @Email
    private String email;
    
    ...
}

@PropertySource注解

用于加载指定的配置文件

@Component
@ConfigurationProperties(prefix = "person")
@PropertySource(value = {"classpath:person.properties"})
public class Person {
	...
}

@ImportResource注解

用于导入Spring的配置文件, 让配置文件中的内容生效

作用于主配置类上, 导入需要的spring配置文件

@SpringBootApplication
@ImportResource(locations = {"classpath:beans.xml"})
public class ConfigApplication {

   public static void main(String[] args) {
      SpringApplication.run(ConfigApplication.class, args);
   }

}


@Configuration配置类

在类中加上@Configuration注解, 指定当前类是一个配置类, 其作用相当于Spring的配置文件

/**
 * @Configuration:指明当前类是一个配置类, 就是来替代之前的Spring配置文件
 * 在配置文件中使用<bean>标签添加组件
 * @Author Harlan
 * @Date 2020/10/3
 */
@Configuration
public class MyAppConfig {

    /**
     * 将方法的返回值添加到容器中
     * @return helloService
     */
    @Bean
    public HelloService helloService(){
        return new HelloService();
    }
}

@Bean注解

其作用在方法上, 用于将方法的返回值注入到IoC容器中, 相当于Spring配置文件中的<bean>标签

/**
 * 将方法的返回值添加到容器中
 * @return helloService
 */
@Bean
public HelloService helloService(){
    return new HelloService();
}


Profile

1. 多Profile文件

我们在著配置文件编写的时候, 文件名可以是 application-{profile}.properties/.yml

默认使用application.properties/.yml配置文件


2. yml文档块

使用---来分割不同的配置信息

profiles: 指定模式名称

active: 指定激活

spring:
  profiles:
    active: prod
server:
  port: 8080
---
spring:
  profiles: dev
server:
  port: 8081
---
spring:
  profiles: prod
server:
  port: 80

3. 激活指定profile

  1. 在配置文件中指定spring.profiles.active=dev

    spring:
      profiles:
        active: dev
    
  2. 命令行方式激活

    --spring.profile.active=dev

在这里插入图片描述

  1. 将项目打成jar包, 使用cmd命令指定参数

    -Dspring.profiles.active=dev



配置文件加载位置

spring boot启动会扫描以下位置的application配置文件作为Spring Boot的默认配置文件.

file:./config/ > file:./ > classpath:./config/ > classpath:./

以上按照优先顺序从高到低加载, 所有位置的文件都会被加载, 高优先级配置内容会覆盖低优先级配置内容, 其他配置内容互补.

同时我们也可以通过配置spring.config.location来改变默认配置


外部配置加载顺序

SpringBoot也可以从以下位置加载配置, 按照优先级从高到低; 高优先级的配置覆盖低优先级配置, 其余互补

  1. 命令行参数

    java -jar spring-boot-xxx-xxx-xxx-SNAPSHOT.jar --server.prot=80 --server.context-path=/hello

  2. 来自java:comp/envJNDI属性

  3. Java系统属性(System.getProperties)

  4. 操作系统环境变量

  5. RandomValuePropertySource配置random.*属性值


    优先加载带profile的配置文件, 由jar包外向jar包内寻找

  6. jar包外部的application-{profile}.properties/yml(带Spring.profile)配置文件

  7. jar包内部的application-{profile}.properties/yml(带Spring.profile)配置文件

  8. jar包外部的application.properties/yml(不带Spring.profile)配置文件

  9. jar包内部的application.properties/yml(不带Spring.profile)配置文件

  10. @Configuration注解类上的@PropertySource

  11. 通过SpringApplication.setDefaultProperties指定的默认属性

所有支持的配置参考SpringBoot参考官方文档: https://spring.io/guides#getting-started-guides



自动配置原理

未学习明白!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值