SpringBoot讀取配置的6種方式
1. 概述
通過(guò)了解springboot加載配置,可以更方便地封裝自定義Starter。
在SpringBoot中,可以使用以下6種方式讀取 yml、properties配置:
- 使用@Value注解:讀取springboot全局配置文件單個(gè)配置。
- 使用Environment接口:通過(guò)Environment接口動(dòng)態(tài)獲取配置。(將yml全部數(shù)據(jù)封裝到Environment對(duì)象)
- 使用@ConfigurationProperties注解:在配置類上使用@ConfigurationProperties注解并指定加載配置項(xiàng)的前綴,就可以批量讀取配置注入自定義類的成員變量中。(自定義類需要提供setter方法)
- 使用PropertySource注解:加載properties文件配置,然后在字段上使用@Value獲取配置。
- 配置PropertySourcesPlaceholderConfigurer的Bean加載自定義yml文件,然后在字段上使用@Value獲取配置。
- Java原生方式獲取配置。(IO流)
環(huán)境準(zhǔn)備:
1、創(chuàng)建maven項(xiàng)目(不需要任何archetype模板構(gòu)建)

2、引入依賴:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.aopmin</groupId>
<artifactId>springboot-loadconfig</artifactId>
<version>1.0.0</version>
<!--父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- SpringBoot配置元數(shù)據(jù)的注解處理器,可以讓自定義配置實(shí)現(xiàn)自動(dòng)補(bǔ)全和校驗(yàn)功能 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- web起步依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- junit -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>3、編寫啟動(dòng)類:
package cn.aopmin;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class LoadConfigApplication {
public static void main(String[] args) {
SpringApplication.run(LoadConfigApplication.class, args);
}
}2. 使用@Value注解讀取單個(gè)配置
1、編寫application.yml文件配置:
student: name: jack age: 20

2、使用@Value讀取配置:
@SpringBootTest
@Slf4j
public class ValueTest {
@Value("${student.name}")
private String name;
@Value("${student.age}")
private Integer age;
@Test
public void test() {
log.info("@Value 配置獲取 name:{},age:{}",name,age);
}
}
@Value注意事項(xiàng):
① @Value 注解只能讀取單個(gè)配置進(jìn)行賦值,無(wú)法讀取整個(gè)配置文件批量賦值。當(dāng)使用@Value注解讀取配置時(shí),確保配置在yml中存在,否則啟動(dòng)程序時(shí)就會(huì)報(bào)錯(cuò)。注解中屬性名引用方式如下:
@Value("${一級(jí)屬性名.二級(jí)屬性名...}")② 當(dāng)使用 @Value 注解引用屬性時(shí),可以在屬性名稱后面使用冒號(hào)(: default-value )的形式添加默認(rèn)值。這樣,如果在配置文件中找不到對(duì)應(yīng)的屬性,就會(huì)使用默認(rèn)值。如果在配置文件中找到了屬性,其值將會(huì)覆蓋默認(rèn)值。
//可以使用各種類型的默認(rèn)值,包括字符串、數(shù)字、布爾值等
@Value("${student.name:aopmin}")
private String name;
@Value("${student.age:18}")
private Integer age;//表示一個(gè)空字符串作為默認(rèn)值
@Value("${student.name:}")
private String name;③ @Value 注解只能用于被Spring管理的Bean中使用,,如使用 @Component 、 @Service 、 @Controller 等注解修飾的類,或者使用Java配置編寫的 @Configuration 類中。
④ @Value 注解可以用于字段、構(gòu)造函數(shù)參數(shù)、方法參數(shù)和方法上。當(dāng)將它放在方法上時(shí),Spring容器初始化時(shí)會(huì)調(diào)用該方法,并將配置屬性的值作為方法的參數(shù)傳遞進(jìn)去。
@Component
public class MyBean {
private String myProperty;
@Autowired
public MyBean(@Value("${my.property}") String myProperty) {
this.myProperty = myProperty;
}
@Value("${another.property}")
public void setAnotherProperty(String anotherProperty) {
// do something with anotherProperty...
}
@Value("${yet.another.property}")
public void processValue(String value) {
// do something with value...
}
}
/*
@Value注解被用于構(gòu)造函數(shù)參數(shù)、setter方法和普通方法上。容器初始化時(shí),會(huì)將配置屬性的值作為參數(shù)傳遞到構(gòu)造函數(shù)、setter方法和普通方法中。
*/⑤ @Value 注解不能在 static 修飾的字段上使用。因?yàn)锧Value注解是通過(guò)訪問(wèn)Spring容器中的上下文來(lái)解析屬性值并注入到目標(biāo)字段中的。由于static字段不屬于對(duì)象實(shí)例,無(wú)法通過(guò)實(shí)例訪問(wèn)容器,所以在靜態(tài)字段上使用@Value注解是無(wú)效的。

3. 使用@ConfigurationProperties注解批量綁定
1、編寫application.yml文件配置:
student: name: jack age: 20
2、使用@ConfigurationProperties批量綁定:
package cn.aopmin.pojo;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 參數(shù)配置類 (需要提供setter方法)
*
* @author 白豆五
* @version 2023/07/16
* @since JDK8
*/
@Component
@Data
//將這個(gè)類與配置文件前綴為student的配置綁定,然后把yml、properties中關(guān)于student的配置信息注入到當(dāng)前類的成員變量中
@ConfigurationProperties(prefix = "student")
public class StudentProperties {
private String name;
}3、測(cè)試
@SpringBootTest
public class ConfigurationPropertiesTest {
@Autowired
private StudentProperties studentProperties;
@Test
public void test() {
System.out.println("讀取配置: name==="+studentProperties.getName());
}
}
@ConfigurationProperties注意事項(xiàng):
- 確保添加了@EnableConfigurationProperties注解:為了使@ConfigurationProperties生效,需要在主配置類上添加@EnableConfigurationProperties(value=xxxxProperties.class)注解,開啟@ConfigurationProperties注解自動(dòng)裝配功能。
- 配置文件中的屬性名與類字段名的映射規(guī)則:默認(rèn)情況下,@ConfigurationProperties會(huì)將配置文件中的屬性名與類字段名進(jìn)行映射。例如,配置文件中的屬性student.name會(huì)自動(dòng)映射到類字段name上。如果配置文件中的屬性名與類字段名不一致,可以使用@Value注解或通過(guò)setter方法來(lái)指定映射關(guān)系。
- 類必須是Spring管理的Bean:被@ConfigurationProperties注解標(biāo)記的類必須是由Spring容器管理的Bean,因此需要確保該類被@Component或其他相關(guān)注解標(biāo)記,以便Spring能夠掃描并創(chuàng)建該類的實(shí)例。
- 支持類型轉(zhuǎn)換:@ConfigurationProperties支持自動(dòng)類型轉(zhuǎn)換,將配置文件中的字符串值轉(zhuǎn)換為目標(biāo)字段的類型。例如,將字符串轉(zhuǎn)換為整數(shù)、布爾值等。如果無(wú)法進(jìn)行類型轉(zhuǎn)換,會(huì)拋出異常。
- 默認(rèn)值和可選屬性:可以為@ConfigurationProperties注解的字段設(shè)置默認(rèn)值,以防止配置文件中缺少對(duì)應(yīng)的屬性??梢允褂?quot;:“符號(hào)指定默認(rèn)值,例如@Value(”${my.property:default-value}")。另外,可以使用required屬性來(lái)指定某個(gè)屬性是否為必需的。
- 配置項(xiàng)的驗(yàn)證和校驗(yàn):可以使用JSR-303/349規(guī)范的注解對(duì)@ConfigurationProperties注解的字段進(jìn)行驗(yàn)證和校驗(yàn)。例如,使用@NotBlank、@Min、@Max等注解來(lái)限制屬性值的有效性。
4. 使用Environment動(dòng)態(tài)獲取配置
1、編寫application.yml文件配置:
student: name: jack age: 20
2、使用Environment動(dòng)態(tài)獲取配置:(將Environment對(duì)象自動(dòng)裝配,然后調(diào)用getProperty()方法獲取指定屬性值)
package cn.aopmin.test;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.Environment;
import javax.annotation.Resource;
/**
* Environment是springboot核心的環(huán)境配置接口,它提供了一些方法用于訪問(wèn)應(yīng)用程序配置屬性。
* 包括系統(tǒng)屬性、操作系統(tǒng)環(huán)境變量、命令行參數(shù)、以及配置文件中定義的屬性等等
*
* @author 白豆五
* @version 2023/07/16
* @since JDK8
*/
@Slf4j
@SpringBootTest
public class EnvironmentTest {
@Resource
private Environment env;
@Test
public void test() {
String name = env.getProperty("student.name");
// 邏輯處理...(也可以控制某一個(gè)bean是否生效)
log.info("Environment配置讀取: name:{}", name);
}}除了自動(dòng)裝配方式,也可以從spring容器中獲取bean:
@Slf4j
@SpringBootTest
public class EnvironmentTest2 implements EnvironmentAware {
private Environment env;
@Test
public void test() {
String name = env.getProperty("student.name");
log.info("Environment配置讀取: name:{}", name);
}
@Override
public void setEnvironment(Environment environment) {
// 邏輯處理...(也可以控制某一個(gè)bean是否生效)
this.env = environment;
}
}Aware是Spring框架提供的一組特殊接口,可以讓Bean從Spring容器中拿到一些資源信息。

Aware接口是一種回調(diào)機(jī)制,當(dāng)Bean被實(shí)例化并注冊(cè)到Spring容器中時(shí),容器會(huì)自動(dòng)調(diào)用Bean中實(shí)現(xiàn)了特定Aware接口的方法,將相應(yīng)的資源或信息傳遞給Bean。
以下是幾個(gè)常用的Aware接口:
- ApplicationContextAware:通過(guò)實(shí)現(xiàn)該接口,Bean可以訪問(wèn)ApplicationContext對(duì)象,從而獲取Spring容器的相關(guān)信息。
- BeanFactoryAware:通過(guò)實(shí)現(xiàn)該接口,Bean可以訪問(wèn)BeanFactory對(duì)象,從而獲取Bean在容器中的相關(guān)信息。
- EnvironmentAware:通過(guò)實(shí)現(xiàn)該接口,Bean可以訪問(wèn)Environment對(duì)象,從而獲取環(huán)境相關(guān)的配置屬性,比如系統(tǒng)屬性、環(huán)境變量等。
- ResourceLoaderAware:通過(guò)實(shí)現(xiàn)該接口,Bean可以訪問(wèn)ResourceLoader對(duì)象,從而獲取資源加載器,用于加載類路徑下的資源文件。
- MessageSourceAware:通過(guò)實(shí)現(xiàn)該接口,Bean可以訪問(wèn)MessageSource對(duì)象,從而獲取國(guó)際化消息。
5.使用@PropertySources注解獲取外部配置
前3種都是從springboot全局配置文件中獲取配置,如果獲取外部自定義文件就不可以啦,我們可以通過(guò)@PropertySources注解獲取==.properties==文件配置。
1、在resources目錄下創(chuàng)建student.properties文件:
student.id=1001 student.name=白豆五
2、在配置類中使用@PropertySources注解綁定配置:
package cn.aopmin.pojo;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/**
* 綁定自定義properties配置
*
* @author 白豆五
* @version 2023/07/16
* @since JDK8
*/
@Data
@Configuration
@PropertySource(value = "classpath:student.properties", encoding = "UTF-8")
public class PropertySourcesConf {
@Value("${student.id}")
private Integer id;
@Value("${student.name}")
private String name;
}3、測(cè)試
@SpringBootTest
@Slf4j
public class PropertySourcesTest {
@Resource
private PropertySourcesConf propertySourcesConf;
@Test
public void test() {
log.info("PropertySources配置讀取 id: {}", propertySourcesConf.getId());
log.info("name: {}", propertySourcesConf.getName());
}
}
6. 配置PropertySourcesPlaceholderConfigurer的Bean獲取外部配置
1、編寫student.yml配置:
file: type: 自定義yaml文件配置
2、 配置PropertySourcesPlaceholderConfigurer獲取自定義yml文件配置:
package cn.aopmin.config;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;
import java.util.Objects;
/**
* 配置PropertySourcesPlaceholderConfigurer讀取yml配置
* @author 白豆五
* @version 2023/07/16
* @since JDK8
*/
@Configuration
public class MyYamlConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer yamlConfigurer() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("student.yml"));//自定義yml文件
//Objects.requireNonNull()方法的作用是如果對(duì)象為空,則拋出空指針異常,否則返回對(duì)象本身。
configurer.setProperties(Objects.requireNonNull(yaml.getObject()));
return configurer;
}
}3、測(cè)試
@SpringBootTest
public class LoadYamlTest {
@Value("${file.type}")
private String fileType;
@Test
public void test() {
System.out.println("讀取yaml配置:"+fileType);
}
}
7. Java原生方式獲取配置
通過(guò)IO流讀取配置,然后放入propertis配置對(duì)象中。
package cn.aopmin.test;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Properties;
/**
* @author 白豆五
* @version 2023/07/16
* @since JDK8
*/
@SpringBootTest
public class CustomTest {
@Test
public void test() {
// 配置對(duì)象
Properties props = new Properties();
InputStreamReader input = null;
try {
// 輸入流 (字節(jié)流轉(zhuǎn)字符流)
input = new InputStreamReader(
this.getClass().getClassLoader().getResourceAsStream("student.properties"),//通過(guò)類加載器來(lái)獲取指定路徑下的資源文件,并返回一個(gè)InputStream對(duì)象
StandardCharsets.UTF_8); //指定編碼格式
// 加載配置
props.load(input);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (input!=null)
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 獲取配置
System.out.println("id:" + props.getProperty("student.id") + ", name:" + props.getProperty("student.name"));
}
}
到此這篇關(guān)于SpringBoot讀取配置的6種方式的文章就介紹到這了,更多相關(guān)SpringBoot讀取配置 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring容器刷新obtainFreshBeanFactory示例詳解
這篇文章主要為大家介紹了Spring容器刷新obtainFreshBeanFactory示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
java實(shí)現(xiàn)爬蟲爬網(wǎng)站圖片的實(shí)例代碼
這篇文章主要介紹了java實(shí)現(xiàn)爬蟲爬網(wǎng)站圖片的實(shí)例代碼,需要的朋友可以參考下2018-06-06
Java中使用注解校驗(yàn)手機(jī)號(hào)格式的詳細(xì)指南
在現(xiàn)代的Web應(yīng)用開發(fā)中,數(shù)據(jù)校驗(yàn)是一個(gè)非常重要的環(huán)節(jié),本文將詳細(xì)介紹如何在Java中使用注解對(duì)手機(jī)號(hào)格式進(jìn)行校驗(yàn),感興趣的小伙伴可以了解下2025-03-03
利用spring aop實(shí)現(xiàn)動(dòng)態(tài)代理
這篇文章主要為大家詳細(xì)介紹了利用spring aop實(shí)現(xiàn)動(dòng)態(tài)代理的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
json-lib將json格式的字符串,轉(zhuǎn)化為java對(duì)象的實(shí)例
下面小編就為大家?guī)?lái)一篇json-lib將json格式的字符串,轉(zhuǎn)化為java對(duì)象的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03

