引言
在 spring boot 中,application.yml 文件用于配置应用程序的属性,spring boot 默认会从 src/main/resources 目录下的 application.properties 或 application.yml 文件中读取配置。读取 application.yml 文件中的配置可以通过以下几种常用的方法进行:
@value: 适合读取简单的单一属性。@configurationproperties: 适合读取复杂的配置集。environment: 适合在运行时动态访问配置。@propertysource: 加载.properties文件。
1. @value 注解读取单个属性
@value 注解用于读取单一简单的配置属性,该注解可以直接应用于字段、构造函数或方法参数上,不要求提供 setter 方法。
在
application.yml配置文件中添加如下配置:
app:
name: myapp
keys:
- key1
- key2
使用 @value 注解从配置文件中读取单个属性值:
- 字段注入:将
@value注解应用于字段,spring 将直接将配置值注入到字段中。
@component
public class mycomponent {
@value("${app.name}")
private string name;
}
- 构造函数注入:
@value也可以用于构造函数参数。
@component
public class mycomponent {
private final string name;
public mycomponent(@value("${app.name}") string name) {
this.name = name;
}
}
- 方法参数注入:
@value注解用于方法参数。
@component
public class mycomponent {
private string name;
@value("${app.name}")
public void setkeys(string name) {
this.name = name;
}
}
注意:@value 注解无法处理复杂的配置,如集合,如下处理会在应用启动时抛出 illegalargumentexception 异常:could not resolve placeholder 'app.keys' in value "${app.keys}"
@value("${app.keys}")
private list<string> keys;
2. 使用 @configurationproperties 注解
@configurationproperties 用于将配置文件中的属性绑定到 java 对象中。适合处理结构化的配置,比如嵌套的属性或复杂的属性集合。
- 在
application.yml配置文件中添加如下配置:
app:
name: myapp
keys:
- key1
- key2
在类上使用 @configurationproperties 注解,并指定前缀,该类会直接映射配置文件中的属性名一致属性:
@component
@configurationproperties(prefix = "app")
public class appproperties {
private list<string> keys;
}
注意:@configurationproperties 读取配置时需要确保配置文件中的属性名与 java 类中的属性名匹配。
3. 通过 environment 对象读取属性
environment 是 spring 中用于管理和访问配置属性、配置文件和环境变量的一个抽象接口,该对象提供了一种管理和访问配置属性、激活的配置文件和环境变量的统一方式。我们可以在任何 spring 管理的 bean 中通过注入 environment 对象来获取配置属性。
- 在 application.yml 配置文件中添加如下配置:
app:
name: myapp
keys:
- key1
- key2
- 在类中注入
environment对象,使用env.getproperty(string key)来检索属性的值。
@component
public class mycomponent {
@autowired
private environment env;
public void printconfig() {
string port = env.getproperty("server.port");
system.out.println("server port: " + port);
}
}
注意:environment 在加载 yml 配置文件时,会将每个元素视为单独的键。
即 application.yml 文件中的配置:
yamlcopy codeapp:
keys:
- key1
- key2
- key3
在 environment 中,将被处理为:
app.keys[0]对应key1app.keys[1]对应key2app.keys[2]对应key3
因此对于复杂配置需要特殊处理,例如获取集合元素需要使用类似数组索引的语法来访问 yaml 文件中的列表元素。
4. 使用 @propertysource 注解加载额外的配置文件
@propertysource 注解是 spring framework 提供的一个注解,用于加载额外 .properties 配置文件或其他资源文件中的属性到 spring 的 environment 中。
在 src/main/resources 目录下创建 config.properties 的属性文件:
app.name=myapp app.version=1.0.0
在配置类上使用 @propertysource 注解来加载配置文件:
@configuration
@propertysource("classpath:config.properties")
//@propertysource({"classpath:config.properties", "classpath:another-config.properties"})
public class appconfig {
}
使用 @value 注解或 environment 对象获取属性:
import org.springframework.beans.factory.annotation.value;
import org.springframework.stereotype.component;
@component
public class mycomponent {
@value("${app.name}")
private string appname;
@autowired
private environment env;
public void printappinfo() {
system.out.println("app name: " + appname);
string appversion = env.getproperty("app.version");
system.out.println("app version: " + appversion);
}
}
注意: 如果需要加载多个属性文件,可以在 @propertysource 注解中使用 value 属性指定多个文件路径:
@propertysource({"classpath:config.properties", "classpath:another-config.properties"})
- 路径:classpath: 前缀表示文件在类路径中。如果文件位于文件系统的其他位置,你可以使用文件系统路径,例如 file:/path/to/config.properties。
- 覆盖:@propertysource 加载的属性文件中的属性会覆盖同名的系统属性,但不会覆盖由 spring boot 的 application.properties 或 application.yml 文件中定义的属性。
- 顺序:如果多个属性文件定义了同一个属性,后加载的文件中的属性值会覆盖先加载的文件中的值。
以上就是springboot读取配置文件的四种方式的详细内容,更多关于springboot读取配置文件的资料请关注代码网其它相关文章!
发表评论