文章目录
在 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
注解从配置文件中读取单个属性值:1. 字段注入:将@Value
注解应用于字段,Spring 将直接将配置值注入到字段中。@ComponentpublicclassMyComponent{@Value("${app.name}")privateString name;}
2. 构造函数注入:@Value
也可以用于构造函数参数。@ComponentpublicclassMyComponent{privatefinalString name;publicMyComponent(@Value("${app.name}")String name){this.name = name;}}
3. 方法参数注入:@Value
注解用于方法参数。@ComponentpublicclassMyComponent{privateString name;@Value("${app.name}")publicvoidsetKeys(String name){this.name = name;}}
注意:
@Value
注解无法处理复杂的配置,如集合,如下处理会在应用启动时抛出
IllegalArgumentException
异常:
Could not resolve placeholder 'app.keys' in value "${app.keys}"
@Value("${app.keys}")privateList<String> keys;
2. 使用 @ConfigurationProperties 注解
@ConfigurationProperties
用于将配置文件中的属性绑定到 Java 对象中。适合处理结构化的配置,比如嵌套的属性或复杂的属性集合。
- 在
application.yml
配置文件中添加如下配置:app:name: MyApp keys:- key1 - key2
- 在类上使用
@ConfigurationProperties
注解,并指定前缀,该类会直接映射配置文件中的属性名一致属性:@Component@ConfigurationProperties(prefix ="app")publicclassAppProperties{privateList<String> keys;}
注意:
@ConfigurationProperties
读取配置时需要确保配置文件中的属性名与 Java 类中的属性名匹配。
3. 通过 Environment 对象读取属性
Environment
是 Spring 中用于管理和访问配置属性、配置文件和环境变量的一个抽象接口,该对象提供了一种管理和访问配置属性、激活的配置文件和环境变量的统一方式。我们可以在任何 Spring 管理的 bean 中通过注入
Environment
对象来获取配置属性。
- 在
application.yml
配置文件中添加如下配置:app:name: MyApp keys:- key1 - key2
- 在类中注入
Environment
对象,使用env.getProperty(String key)
来检索属性的值。@ComponentpublicclassMyComponent{@AutowiredprivateEnvironment env;publicvoidprintConfig(){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]
对应key1
app.keys[1]
对应key2
app.keys[2]
对应key3
因此对于复杂配置需要特殊处理,例如获取集合元素需要使用类似数组索引的语法来访问 YAML 文件中的列表元素。
4. 使用 @PropertySource 注解加载额外的配置文件
@PropertySource
注解是 Spring Framework 提供的一个注解,用于加载额外
.properties
配置文件或其他资源文件中的属性到 Spring 的
Environment
中。
- 在
src/main/resources
目录下创建config.properties
的属性文件:app.name=MyAppapp.version=1.0.0
- 在配置类上使用
@PropertySource
注解来加载配置文件:@Configuration@PropertySource("classpath:config.properties")//@PropertySource({"classpath:config.properties", "classpath:another-config.properties"})publicclassAppConfig{}
- 使用
@Value
注解或Environment
对象获取属性:importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Component;@ComponentpublicclassMyComponent{@Value("${app.name}")privateString appName;@AutowiredprivateEnvironment env;publicvoidprintAppInfo(){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
文件中定义的属性。- 顺序:如果多个属性文件定义了同一个属性,后加载的文件中的属性值会覆盖先加载的文件中的值。
版权归原作者 @赵士杰 所有, 如有侵权,请联系我们删除。