很多时候,我们需要将一些配置信息写在配置文件中,例如邮件账号等,最简单的方式就是写在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