SpringBoot2.0学习笔记:(二) 配置文件的使用

版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/liujun03/article/details/82503714

1. 简单介绍

在使用Spring Initializr快速创建好一个Spring Boot项目之后,可以看到在resource目录下有一个application.properties文件,这是Spring Boot的全局配置文件。其名称是固定的,或是application.properties或是application.yml。它的作用在于修改Spring Boot自动配置的默认值。

2. 配置文件属性注入

####2.1 定义普通Java类

public class Animal {

    private String name;
    private int age;
    
    // 忽略getter-setter 与toString()
}
public class Person {

    private String name;
    private int age;
    private Date birthDay;
    private boolean boy;
    private Animal animal;
    private Map<String,Object> map;
    private List<String> list;
    
    // 忽略getter-setter 与toString()
}

这里写图片描述

####2.2 定义配置文件内容:

application.properties:

person.name=张三
person.age=19
person.boy=false
person.birthDay=1995/12/11
person.map.key1=val1
person.map.key2=qw2
person.map.key3=22
person.list=aa,bb,cc
person.animal.name=dog
person.animal.age=4

2.3 属性注入

我们可以使用@ConfigurationProperties 注解将配置文件中的某些属性值映射到组件中,其作用就是通知SpringBoot将本类中的所有属性和配置文件中相关的属性进行绑定,@ConfigurationProperties还有一个属性为prefix,其为配置文件中相关属性的前缀。@ConfigurationProperties需结合@Component使用,因为只有容器中的组件才能使用容器提供的@ConfigurationProperties功能。具体如下:

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

    private String name;
    private int age;
    private Date birthDay;
    private boolean boy;
    private Animal animal;
    private Map<String,Object> map;
    private List<String> list;
}

2.4 测试

在test目中,有一个自动生成的单元测试类,我们可以在里面测试一下属性是否真的成功注入了:


@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootHelloworldApplicationTests {

    @Autowired
    Person person;

	@Test
	public void contextLoads() {
	    System.out.println(person.toString());
	}

}

直接执行测试方法,可以看到控制台输出了:

Person{name='张三', age=19, birthDay=Mon Dec 11 00:00:00 CST 1995, boy=false, animal=Animal{name='dog', age=4}, map={key1=val1, key2=qw2, key3=22}, list=[aa, bb, cc]}

用IDE开发在这里输出中文的时候,可能遭遇乱码,我们修改一下IDEA的设置:

这里写图片描述

3. @PropertySource的使用

一个正式的项目肯定有很多的配置,将这些配置都放在同一个application.properties配置文件中,未免有些不合适,我们可以定义多个配置文件,将不同功能的配置分别放在不同的文件中。那么我们该如何引入这些配置文件呢?毕竟Spring Boot默认只读取application.properties这个全局配置文件。

@PropertySource,目的是就是用来加载指定的属性文件。

我们先在resources资源文件夹下新建一个config文件夹,在里面建一个person.properties文件,将application.properties中关于person的配置复制到person.properties文件中,最后清空application.properties。

这里写图片描述

我们先跑一下刚才的测试方法,得到下面的结果:

Person{name='null', age=0, birthDay=null, boy=false, animal=null, map=null, list=null}

可以看到没有任何属性被赋值。

现在用@PropertySource将person.properties加载进来

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

    private String name;
    private int age;
    private Date birthDay;
    private boolean boy;
    private Animal animal;
    private Map<String,Object> map;
    private List<String> list;
}

在执行测试方法看一下结果:

Person{name='张三', age=19, birthDay=Mon Dec 11 00:00:00 CST 1995, boy=false, animal=Animal{name='dog', age=4}, map={key3=22, key2=qw2, key1=val1}, list=[aa, bb, cc]}

可以看出配置文件被加载进来了。

4. 配置文件占位符

在Spring Boot的配置文件中,我们可以使用Spring Boot提供的一些随机数来作为属性的值,例如:

person.name=白丁_${random.uuid}
person.age=${random.int(30)}
person.boy=false
person.birthDay=1995/12/11
person.map.key1=${random.value}
person.map.key2=qw2
person.map.key3=22
person.list=aa,bb,cc
person.animal.name=${person.name}_cat
person.animal.age=4

看一下输出了什么:

Person{name='白丁_ea262a01-3237-489e-b81a-416dacce1fd2', age=16, birthDay=Mon Dec 11 00:00:00 CST 1995, boy=false, animal=Animal{name='白丁_d34d4872-e98c-4567-9ef8-1b6c454a08ef_cat', age=4}, map={key1=9e347bcbf5975aab1ac3f5741e8b89f1, key2=qw2, key3=22}, list=[aa, bb, cc]}

在配置文件中,随机数可以有如下的写法:

${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
${random.uuid}

占位符还可以获取之前的配置的值:

person.animal.name=${person.name}_cat

若是${person.name}没有值的话,会直接输出这个占位符。但我们可以赋予它一个默认值:

person.animal.name=${person.name:白丁}_cat

当${person.name}获取不到值的时候,person.animal.name的值就为白丁_cat

5. 配置文件加载位置

Spring Boot启动以后会扫描以下位置的application.properties或者application.yml作为Spring Boot的默认配置文件。

  • file:./config

这里写图片描述

  • file:./

这里写图片描述

  • classpath:/config/

这里写图片描述

  • classpath:/

这里写图片描述

以上按照优先级从高到低的顺序排列,所有位置的文件都会被加载,高优先级的配置内容会覆盖低优先级内容,但这些配置文件也形成了互补配置。即这些配置文件中相同的配置低优先级会被高优先级覆盖,但低优先级文件中不同的配置依然会被正常加载。

最后,我们还以通过spring.config.location来改变默认的配置文件位置

项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默 认加载的这些配置文件共同起作用形成互补配置 。

java -jar spring-boot-helloworld-0.0.1.jar --spring.config.location=D:/a
pplication.properties

6. 外部配置加载顺序

SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会 形成互补配置

  • 1:命令行参数

    Spring Boot所有的配置都可以在命令行上进行指定,多个配置可以用空格隔开

    java -jar spring-boot-helloworld-0.0.1.jar --spring.profiles.active=dev --server.port=8090

  • 2:Java系统属性,如虚拟机参数

  • 3:由jar包外向jar包内进行寻找; 优先加载带profile 的配置文件

    首先加载jar包外部(与jar包同级目录)的application-{profile}.properties ,在加载jar包内部的application-{profile}.properties,之后加载jar外部的application.properties ,最后才是加载jar包内部的application.properties

  • 4:@Configuration注解类上的@PropertySource

  • … …(官方文档有17种配置加载方式,这里只列举集中常用的)

猜你喜欢

转载自blog.csdn.net/liujun03/article/details/82503714
今日推荐