6、Properties配置

本文详细介绍了SpringBoot中application.properties配置文件的位置问题、文件名的灵活性、属性注入(普通与类型安全的方式)以及配置文件的加载优先级。通过@ConfigurationProperties注解实现了类型安全的属性注入,简化了大量属性配置的工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、位置问题

SpringBoot中采用了大量的自动化配置,但是对开发者而言,在实际项目中不可避免会有一些需要自己手动配置,比如数据库连接用户名、密码等,承载这些自定义配置的文件就是resources目录下的application.properties文件(也可以使用YAML配置来代替application。properties配置)。在前面Web容器配置章节中,我们已经见识到application.properties配置的基本用法了,现在我们来进一步了解application.properties。
SpringBoot项目中的application.properties配置文件一共可以出现在如下4个位置:

  1. 项目根目录下的config文件夹中;、
  2. 项目根目录下;
  3. classpath下的config文件夹中;
  4. classpath下。

如果这4个位置中都有application.properties文件,那么加载的优先级从1到4依次降低,如图所示,SpringBoot将按照这个优先级查找配置信息,并加载到Spring Environment中。
在这里插入图片描述
如果未使用application.properties,而是使用了application.yml作为配置文件,那么配置文件的优先级也与上图一致。
默认情况下,SpringBoot启动时,默认会按照上面那4个位置顺序去查找相关属性并加载,但是,这也不是绝对的,我们也可以在项目启动时自定义配置文件。
例如,现在在resources目录下创建一个csconfig目录,目录中存放一个application.properties文件,那么正常情况下,当我们启动项目时,这个配置文件是不会自动加载的。我们可以通过spring.config.location属性来手动指定配置文件位置,指定完成后,系统就会自动去指定目录下查找application.properties文件。
此时启动项目,就会发现项目以classpath:/csconfig/application.properties配置文件启动。
在这里插入图片描述
这是在开发工具中配置了启动位置,如果项目已经打包成jar,在启动命令中使用spring.config.location可以指定配置文件所在目录(注意需要以/结束),代码如下:

java -jar springbootdemo 0.0.1-SNAPSHOT.jar --spring.config.location=classpath:/csconfig/

2、文件名问题

对于application.properties而言,它不一定非要叫application,但是项目默认是去加载名为application的配置文件,如果我们的配置文件不叫application,也是可以的,但是,需要明确指定配置文件的文件名。
方式和指定路径一致,只不过此时的key是spring.config.name。
首先我们在resources目录下创建一个app.properties文件,然后在IDEA中指定配置文件的文件名:
在这里插入图片描述
指定完配置文件名之后,再次启动项目,此时系统会自动去默认的四个位置下面分别查找名为 app.properties 的配置文件。当然,允许自定义文件名的配置文件不放在四个默认位置,而是放在自定义目录下,此时就需要明确指定 spring.config.location 。

配置文件位置和文件名称可以同时自定义。
如果项目已经打包成jar,在启动命令中使用如下命令,代码如下:

java -jar springbootdemo 0.0.1-SNAPSHOT.jar --spring.config.name=app --spring.config.location=classpath:/

3、普通的属性注入

由于SpringBoot源自Spring,所以Spring中存在的属性注入,在SpringBoot中一样也存在。由于在SpringBoot中,默认会自动加载application.properties文件,所以简单的属性注入可以直接在这个配置文件中写。
例如,现在定义一个Book类:

package com.cs.entity;


public class Book {
    private int id;
    private String name;
    private String author;
    private double price;


    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

然后在application.peoperties文件中定义属性:

book.id=1
book.name=三国演义
book.author=罗贯中
book.price=45.8

按照传统的Spring中的方式,可以直接通过@Value注解将这些属性注入到Book对象中,改造Book类:

package com.cs;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class Book {
    @Value("${book.id}")
    private int id;
    @Value("${book.name}")
    private String name;
    @Value("${book.author}")
    private String author;
    @Value("${book.price}")
    private double price;


    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

注意:
Book对象本身也要交给Spring容器去管理,如果Book没有交给Spring容器,那么Book中的属性也无法从Spring容器中获取到值。
配置完成后,在Controller或者单元测试中注入Book对象,启动项目,就可以看到属性已经注入到对象中了,单元测试代码如下:

package com.cs;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookTest {
    @Autowired
    Book book;

    @Test
    public void getBook(){
        System.out.println(book);
    }
}

在这里插入图片描述
一般来说,我们在application.properties文件中主要存放系统配置,这种自定义配置不建议放在该文件中,我们可以自定义properties文件来存放自定义配置。
例如在resources目录下,自定义book.properties文件,内容如下:

book.id=2
book.name=红楼梦
book.author=曹雪芹
book.price=68.8

此时,启动项目并不会自动加载该配置文件,如果是在XML配置中,可以通过如下方式引用该properties文件:

<context:property-placeholder location="classpath:book.properties"/>

如果是在Java配置中,可以通过@PropertySource来引入配置:

@Component
@PropertySource("classpath:book.properties")
public class Book {
    @Value("${book.id}")
    private int id;
    @Value("${book.name}")
    private String name;
    @Value("${book.author}")
    private String author;
    @Value("${book.price}")
    private double price;
    //省略部分代码

这样,当项目启动时,就会自动加载book.properties文件:
在这里插入图片描述
这只是Spring中属性注入的一个简单用法,和SpringBoot没有任何关系。

4、类型安全的属性注入

SpringBoot引入了类型安全的属性注入,如果采用Spring中的配置方式,当配置的属性非常多的时候,工作量就很大了,而且容易出错。
使用类型安全的属性注入,可以有效地解决这个问题。
这里直接改在Book类:

package com.cs;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("classpath:book.properties")
@ConfigurationProperties(prefix = "book")
public class Book {
    private int id;
    private String name;
    private String author;
    private double price;


    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

在这里插入图片描述
这里主要引入了@ConfigurationProperties(prefix = “book”)注解,并且配置了属性的前缀,此时会自动将Spring容器中对应的数据注入到对象对应的属性中,就不用通过@Value注解挨个注入了,减少了工作量并且避免出错。

5、总结

application.properties是SpringBoot中配置的一个重要载体,很多组件的属性都可以在这里定制,它的用法和yaml比较类似,关于yaml配置,我们下面再讲。

本文参考:http://springboot.javaboy.org/2019/0530/application.properties

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值