很多时候,我们需要将一些配置信息写在配置文件中,例如邮件账号等,最简单的方式就是写在application.yml中,然后通过@Value注解获取。

1、@Value

例如配置文件这个样子:

mail:
  username: xueye
  password: xueye.password
  sender: xueye@simaek.com
  host: mail.xueye.io
  port: 587

我们需要用到配置的地方使用@Value(${property}注解获取:

// 成员变量上
@Value(${mail.username})
String username;

// Set方法上
@Value(${mail.username})
public void setUsername(String username){
    this.username = username;
}

但是这种方式是不推荐的。最佳实践是通过@ConfigurationProperties注解将配置信息和Bean绑定。

2、@ConfigurationProperties

还是上面的配置,添加一个Bean如下,为了不啰嗦,只写了部分属性。

这种方式会将配置文件中mail开头的配置,自动注入到Bean属性上,在需要读取配置信息的时候,可以需要的地方将这个配置Bean像普通Bean一样注入。

还有一个好处就是,IDEA中不会再有警告信息了,而且在填写配置的时候会有自动提示。

@Component
@ConfigurationProperties(prefix = "mail")
public class MailProperties {
    /**
     * 用户名
     */
    private String username;
    /**
     * 密码
     */
    private String password;
    
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

另外还可以方便的对属性进行校验,例如邮箱,如果校验不通过,就会抛出数据绑定异常,程序就无法运行,保证了安全性。

@Email
private String mail;

3、@PropertyResource

以上都是使用spring默认的配置文件application.yml,有时我们可能有自己单独的配置文件,这种情况下可以使用@PropertyResource注解读取指定的配置文件。示例如下,为了简洁省略了get、set方法。

@Component
@PropertySource("classpath:mail.properties")
class MailProperties {
    @Value("${mail.username}")
    private String username;
}
补充一下SpringBoot配置文件优先级,从高到下依次是:

config/application.yml(jar包所在目录)

classpath:config/application.yml

classpath:application.yml

最后修改:2021 年 07 月 22 日 09 : 08 AM