配置文件

1、配置文件

SpringBoot使用一个全局的配置文件

  • application.properties
  • application.yml

配置文件名是固定的;
他的作用是修改SpringBoot自动配置的默认值。
YAML a markup language:是一种标记语言
YAML isn’t markup language:不是一种标记语言

YAML以数据为中心,比json,xml更适合做配置文件;

server:
    port:8081

xml

<server>
    <port>8081</port>
</server>

2、YAML基本语法

1. 基本语法

k:(空格)v: 表示一对键值对(空格必须有)
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一级的

server:
    port:8081
    path:/hello

属性和值也是大小写敏感

2、值的写法
字面量:就是普通的值(字符串,数字,布尔)

k: v: 字面直接来写
字符串默认不用加上单引号或双引号;
“”:双引号:不会转义特殊字符;也就是说特殊字符会表示成想要的模样
name: “zhangsan \n lisi”: 输出:zhangsan换行lisi
‘’: 单引号:回转仪特殊字符,特殊字符最终只是一普通的字符串
name: ‘zhangsan \n lisi’
输出:zhangsan \n lisi

对象、map(属性和值)(键值对):

k:v 在k的下一行写对象的属性和值,注意缩进
对象还是k:v的方式

friends:
   lastName:zhangsan
   age:20

行内写法

friends: {lastName: zhangsan,age:18}
数组(List,Set)
pets:
 - cat
 - dog
 - pig

行内写法

pets:[cat,dog,pig]

3、配置文件的值注入

配置文件application.yml 属性

# 配置person
person:
  name: zhangsan
  boss: false
  list:
  - lisi
  - tom
  - jerry
  map: {k1: v1,k2: v2}
  dog:
    name: wangwang
    age: 2
  age: 16
  birthday: 2020/1/26

相关的javaBean 类

/**
 * ConfigurationProperties注解的作用是将配置文件中的相关配置与
 * 配置这个注解的组件的属性进行一一映射
 * 
 * prefix = "person" 从application.yml中找前缀是person的属性
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private Date birthday;
    private String name;
    private Integer age;
    private List<String> list;
    private Map<String,Object> map;
    private Dog dog;
    private boolean boss;
public class Dog {   
private String name;   
private Integer age;

pom.xml中需要导入的configuration依赖,可以帮助减少属性注入时出错,他会在写配置时提示对应组件的相关属性

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

SpringBoot测试

@SpringBootTest
class QuickstartApplicationTests {

    @Autowired
    Person person;
    @Test
    void contextLoads() {
        System.out.println(person);
    }

}

测试结果:
Person
{birthday=Sun Jan 26 00:00:00 CST 2020, name=‘zhangsan’,
age=22,
list=[lisi, tom, jerry],
map={k1=v1, k2=v2}, dog=Dog{name=‘wangwang’, age=2}, boss=false}

在properties文件中设置对象属性
person.age=19
person.birthday=2020/2/16
person.boss=false
person.dog.age=2
person.dog.name=dog
person.name=张三
person.list=d1,d2,d3
person.map.k1=v1
person.map.k2=v2

需要注意的是:*.properties文件默认编码是GBK,但是idea默认编码是UTF-8编译,所以要将配置文件的编码格式改为UTF-8,并且当有中文时转为GBK编码

输出结果:
Person{birthday=Sun Feb 16 00:00:00 CST 2020, name='张三', age=19, list=[d1, d2, d3], map={k1=v1, k2=v2}, dog=Dog{name='dog', age=2}, boss=false}

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

@ConfigurationProperties

@Value

功能

批量注入配置文件中的属性

需要一个个指定

松散绑定

支持

不支持

Spel

不支持

支持

JSR303数据校验

支持

不支持

复杂类型封装

支持

不支持

总结:无论是yml配置文件还是properties文件都可以获取到值,如果我们需要在业务逻辑中获取文件的某个值,那就用@Value,一般情况下用@ConfigurationProperties配置文件注入值。

4、@PropertySource&@ImportResource

@PropertySource可以加载指定的配置文件。
这次我们不在默认的application.properties文件中设置person的属性值,我们在resources目录下再创建一个person.properties文件。那怎样把这个配置文件中所设置的属性注入到组件中呢?

@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private Date birthday;
    private String name;
    private Integer age;
    private List<String> list;
    private Map<String,Object> map;
    private Dog dog;
    private boolean boss;

@PropertySource(value = {“classpath:person.properties”})

person.age=19
person.birthday=2020/2/16
person.boss=false
person.dog.age=2
person.dog.name=dog
person.name=李四
person.list=d1,d2,d3
person.map.k1=v1
person.map.k2=v2

我们注释掉原来在application.properties的属性

运行输入结果:
Person{birthday=Sun Feb 16 00:00:00 CST 2020,
name=‘李四’,
age=19, list=[d1, d2, d3], map={k2=v2, k1=v1}, dog=Dog{name=‘dog’, age=2}, boss=false}
也就是说配置没有问题。

@ImportResource:导入Spring的配置文件,让配置文件中的内容生效;
SpringBoot里面没有Spring的配置文件,我们自己创建的Spring xml不能被识别。

例如,我现在创建一个beans.xml,里面放一个bean,现在什么都不做,测试一下IOC容器中有没有这个javaBean。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="helloService" class="cn.edu.nyist.quickstart.service.HelloService"></bean>
</beans>
@Autowired
    ApplicationContext ioc;

    @Test
    void testHelloService() {
        boolean b = ioc.containsBean("helloService");
        System.out.println(b); //false
    }

想让Spring的配置文件生效,只需在配置类上标注@ImportResource注解

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

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

}

然后再测试输出
true,也就是在beans.xml 中的组件已经成功的交给IOC容器了。

SpringBoot推荐给容器中添加组件的方式是使用全注解的方式。

@Configuration: 指明当前类是一个配置类,就是替代原来的Spring配置文件

@Bean注解

@Configuration
public class MyConfig {

    @Bean  
    public HelloService helloService(){ // 默认生成的bean的id就是方法名
        System.out.println("@Bean给IOC配置 HelloService");
        return new HelloService();
    }
}

/默认生成的bean的id就是方法名
控制台输出
@Bean给IOC配置 HelloService
true

4、配置文件占位符
可以使用随机数

${random.value}, ${random.int}、${random.long}, ${random.int(10)}, ${random.int(1024,65535)}

2、占位符获取之前配置的值
person.age=${random.int}
person.birthday=2020/2/16
person.boss=false
person.dog.age=2
person.dog.name=${person.name:hello}_dog
person.name=张三_${random.uuid}
person.list=d1,d2,d3
person.map.k1=v1
person.map.k2=v2

输出

Person
{birthday=Sun Feb 16 00:00:00 CST 2020, name='张三_87ee8799-7bf3-4282-9334-1916d0f31643', 
age=-899833181, 
list=[d1, d2, d3], 
map={k1=v1, k2=v2}, 
dog=Dog{name='张三_ae5ea0bf-0242-4376-9276-5ebbfb969866_dog', 
age=2}, 
boss=false}
5、Profile
1.多Profile文件

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

springboot 配置参数map_springboot 配置参数map


默认使用application.properties配置文件中的设置。

2、yml支持多文档方式
# 第一个文档快
spring:
  profiles:
    active: prod #激活prod环境的端口号
server:
  port: 8080
---
# 第二个文档快
server:
  port: 8082
spring:
  profiles: dev
---
# 第3个文档快
server:
  port: 8083

spring:
  profiles: prod
---
# 第4个文档快
3、激活指定的profile

需要指定其他profile中的端口号时,

spring.profiles.active=prod
# prod指的是生产环境,dev,是开发环境的简写

application-prod.properties中指定的端口号是
server.port=8090

第二种方式

在idea 运行/调试配置中

找到program args:输入

--spring.profiles.active=dev

springboot 配置参数map_spring_02


然后保存,运行,这时的环境配置就是dev环境下的内容,当然端口号也变成了8082

第三种方式

在idea中还是运行/调试配置,

点击编辑配置就进来了

还是上面的那个界面

这次设置虚拟机参数

springboot 配置参数map_spring_03


输入-Dspring.profiles.active=dev 这时也能切换到指定环境。

刚开始学,有不足之处,还请大佬们指出
待续…