SpringBoot读取配置的6种方式

1. 概述


通过了解springboot加载配置,可以更方便地封装自定义Starter。

在SpringBoot中,可以使用以下6种方式读取 yml、properties配置:

  1. 使用@Value注解:读取springboot全局配置文件单个配置。
  2. 使用Environment接口:通过Environment接口动态获取配置。(将yml全部数据封装到Environment对象)
  3. 使用@ConfigurationProperties注解:在配置类上使用@ConfigurationProperties注解并指定加载配置项的前缀,就可以批量读取配置注入自定义类的成员变量中。(自定义类需要提供setter方法)
  4. 使用PropertySource注解:加载properties文件配置,然后在字段上使用@Value获取配置。
  5. 配置PropertySourcesPlaceholderConfigurer的Bean加载自定义yml文件,然后在字段上使用@Value获取配置。
  6. Java原生方式获取配置。(IO流)

环境准备:

1、创建maven项目(不需要任何archetype模板构建)

在这里插入图片描述

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配置元数据的注解处理器,可以让自定义配置实现自动补全和校验功能 --><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、编写启动类:

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注解读取单个配置


1、编写application.yml文件配置:

student:name: jackage: 20

在这里插入图片描述

2、使用@Value读取配置:

@SpringBootTest
@Slf4j
public class ValueTest {@Value("${student.name}")private String name;@Value("${student.age}")private Integer age;@Testpublic void test() {log.info("@Value 配置获取 name:{},age:{}",name,age);}
}

在这里插入图片描述


@Value注意事项:

@Value注解只能读取单个配置进行赋值,无法读取整个配置文件批量赋值。当使用@Value注解读取配置时,确保配置在yml中存在,否则启动程序时就会报错。注解中属性名引用方式如下:

@Value("${一级属性名.二级属性名...}")

② 当使用@Value注解引用属性时,可以在属性名称后面使用冒号(:default-value)的形式添加默认值。这样,如果在配置文件中找不到对应的属性,就会使用默认值。如果在配置文件中找到了属性,其值将会覆盖默认值。

//可以使用各种类型的默认值,包括字符串、数字、布尔值等
@Value("${student.name:aopmin}")
private String name;@Value("${student.age:18}")
private Integer age;
//表示一个空字符串作为默认值
@Value("${student.name:}")
private String name;

@Value注解只能用于被Spring管理的Bean中使用,,如使用@Component@Service@Controller等注解修饰的类,或者使用Java配置编写的@Configuration类中。

@Value注解可以用于字段、构造函数参数、方法参数和方法上。当将它放在方法上时,Spring容器初始化时会调用该方法,并将配置属性的值作为方法的参数传递进去。

@Component
public class MyBean {private String myProperty;@Autowiredpublic 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注解被用于构造函数参数、setter方法和普通方法上。容器初始化时,会将配置属性的值作为参数传递到构造函数、setter方法和普通方法中。
*/

@Value注解不能在static修饰的字段上使用。因为@Value注解是通过访问Spring容器中的上下文来解析属性值并注入到目标字段中的。由于static字段不属于对象实例,无法通过实例访问容器,所以在静态字段上使用@Value注解是无效的。

在这里插入图片描述


3. 使用@ConfigurationProperties注解批量绑定


1、编写application.yml文件配置:

student:name: jackage: 20

2、使用@ConfigurationProperties批量绑定:

package cn.aopmin.pojo;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** 参数配置类   (需要提供setter方法)** @author 白豆五* @version 2023/07/16* @since JDK8*/@Component
@Data
//将这个类与配置文件前缀为student的配置绑定,然后把yml、properties中关于student的配置信息注入到当前类的成员变量中
@ConfigurationProperties(prefix = "student")
public class StudentProperties {private String name;
}

3、测试

@SpringBootTest
public class ConfigurationPropertiesTest {@Autowiredprivate StudentProperties studentProperties;@Testpublic void test() {System.out.println("读取配置: name==="+studentProperties.getName());}
}

在这里插入图片描述

@ConfigurationProperties注意事项:

  1. 确保添加了@EnableConfigurationProperties注解:为了使@ConfigurationProperties生效,需要在主配置类上添加@EnableConfigurationProperties(value=xxxxProperties.class)注解,开启@ConfigurationProperties注解自动装配功能。
  2. 配置文件中的属性名与类字段名的映射规则:默认情况下,@ConfigurationProperties会将配置文件中的属性名与类字段名进行映射。例如,配置文件中的属性student.name会自动映射到类字段name上。如果配置文件中的属性名与类字段名不一致,可以使用@Value注解或通过setter方法来指定映射关系。
  3. 类必须是Spring管理的Bean:被@ConfigurationProperties注解标记的类必须是由Spring容器管理的Bean,因此需要确保该类被@Component或其他相关注解标记,以便Spring能够扫描并创建该类的实例。
  4. 支持类型转换:@ConfigurationProperties支持自动类型转换,将配置文件中的字符串值转换为目标字段的类型。例如,将字符串转换为整数、布尔值等。如果无法进行类型转换,会抛出异常。
  5. 默认值和可选属性:可以为@ConfigurationProperties注解的字段设置默认值,以防止配置文件中缺少对应的属性。可以使用":“符号指定默认值,例如@Value(”${my.property:default-value}")。另外,可以使用required属性来指定某个属性是否为必需的。
  6. 配置项的验证和校验:可以使用JSR-303/349规范的注解对@ConfigurationProperties注解的字段进行验证和校验。例如,使用@NotBlank、@Min、@Max等注解来限制属性值的有效性。

4. 使用Environment动态获取配置


1、编写application.yml文件配置:

student:name: jackage: 20

2、使用Environment动态获取配置:(将Environment对象自动装配,然后调用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核心的环境配置接口,它提供了一些方法用于访问应用程序配置属性。* 包括系统属性、操作系统环境变量、命令行参数、以及配置文件中定义的属性等等** @author 白豆五* @version 2023/07/16* @since JDK8*/
@Slf4j
@SpringBootTest
public class EnvironmentTest {@Resourceprivate Environment env;@Testpublic void test() {String name = env.getProperty("student.name");// 逻辑处理...(也可以控制某一个bean是否生效)log.info("Environment配置读取: name:{}", name);}}

除了自动装配方式,也可以从spring容器中获取bean:

@Slf4j
@SpringBootTest
public class EnvironmentTest2 implements EnvironmentAware {private Environment env;@Testpublic void test() {String name = env.getProperty("student.name");log.info("Environment配置读取: name:{}", name);}@Overridepublic void setEnvironment(Environment environment) {// 逻辑处理...(也可以控制某一个bean是否生效)this.env = environment;}
}

Aware是Spring框架提供的一组特殊接口,可以让Bean从Spring容器中拿到一些资源信息。

在这里插入图片描述

Aware接口是一种回调机制,当Bean被实例化并注册到Spring容器中时,容器会自动调用Bean中实现了特定Aware接口的方法,将相应的资源或信息传递给Bean。

以下是几个常用的Aware接口:

  • ApplicationContextAware:通过实现该接口,Bean可以访问ApplicationContext对象,从而获取Spring容器的相关信息。

  • BeanFactoryAware:通过实现该接口,Bean可以访问BeanFactory对象,从而获取Bean在容器中的相关信息。

  • EnvironmentAware:通过实现该接口,Bean可以访问Environment对象,从而获取环境相关的配置属性,比如系统属性、环境变量等。

  • ResourceLoaderAware:通过实现该接口,Bean可以访问ResourceLoader对象,从而获取资源加载器,用于加载类路径下的资源文件。

  • MessageSourceAware:通过实现该接口,Bean可以访问MessageSource对象,从而获取国际化消息。


5.使用@PropertySources注解获取外部配置


前3种都是从springboot全局配置文件中获取配置,如果获取外部自定义文件就不可以啦,我们可以通过@PropertySources注解获取==.properties==文件配置。

1、在resources目录下创建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、测试

@SpringBootTest
@Slf4j
public class PropertySourcesTest {@Resourceprivate PropertySourcesConf propertySourcesConf;@Testpublic 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 {@Beanpublic static PropertySourcesPlaceholderConfigurer yamlConfigurer() {PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();yaml.setResources(new ClassPathResource("student.yml"));//自定义yml文件//Objects.requireNonNull()方法的作用是如果对象为空,则抛出空指针异常,否则返回对象本身。configurer.setProperties(Objects.requireNonNull(yaml.getObject()));return configurer;}
}

3、测试

@SpringBootTest
public class LoadYamlTest {@Value("${file.type}")private String fileType;@Testpublic void test() {System.out.println("读取yaml配置:"+fileType);}
}

在这里插入图片描述


7. Java原生方式获取配置


通过IO流读取配置,然后放入propertis配置对象中。

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 {@Testpublic void test() {// 配置对象Properties props = new Properties();InputStreamReader input = null;try {// 输入流 (字节流转字符流)input = new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("student.properties"),//通过类加载器来获取指定路径下的资源文件,并返回一个InputStream对象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"));}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/4533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

流程工业停机的实际成本

流程制造工厂面临着避免停机的巨大压力&#xff0c;因为这可能会严重影响企业的整体生产力、盈利能力和声誉。企业对计划外停机的原因和成本了解得越多&#xff0c;就能做更多的事情来帮助降低停机的发生率&#xff0c;并在停机发生时更好地做好应对准备。 图.石油炼化工厂&…

【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B:美国纽约公共自行车使用量预测分析 问题一Python代码分析

2023 年第二届钉钉杯大学生大数据挑战赛 初赛 B&#xff1a;美国纽约公共自行车使用量预测分析 问题一 1 题目 Citi Bike是纽约市在2013年启动的一项自行车共享出行计划&#xff0c;由“花旗银行”(Citi Bank)赞助并取名为“花旗单车”(Citi Bike)。在曼哈顿&#xff0c;布鲁克…

王道计算机网络学习笔记(4)——网络层

前言 文章中的内容来自B站王道考研计算机网络课程&#xff0c;想要完整学习的可以到B站官方看完整版。 四&#xff1a;网络层 ​​​​​​​​​​​​​​在计算机网络中&#xff0c;每一层传输的数据都有不同的名称。 物理层&#xff1a;传输的数据称为比特&#xff08;Bi…

vmware-ubuntu 出现的奇怪问题

虚拟机突然连不上网 参考博文-CSDN-卍一十二画卍&#xff08;作者&#xff09;-Vmware虚拟机突然连接不上网络【方案集合】 sudo vim /var/lib/NetworkManager/NetworkManager.statesudo service network-manager stop sudo vim /var/lib/NetworkManager/NetworkManager.stat…

git -- SSL certificate problem

SSL certificate problem 1.问题描述 新建一个仓库&#xff0c;在向里面上传文件时&#xff0c;出现SSL证书问题 2.解决方法 这个问题是由于没有配置信任的服务器HTTPS验证。默认&#xff0c;cURL被设为不信任任何CAs&#xff0c;就是说&#xff0c;它不信任任何服务器验证。…

HOT64-搜索二维矩阵

leetcode原题链接&#xff1a;搜索二维矩阵 题目描述 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回…

【机器学习】吴恩达课程1-Introduction

一、机器学习 1. 定义 计算机程序从经验E中学习&#xff0c;解决某一任务T&#xff0c;进行某一性能P&#xff0c;通过P测定在T上的表现因经验E而提高。 2. 例子 跳棋程序 E&#xff1a;程序自身下的上万盘棋局 T&#xff1a;下跳棋 P&#xff1a;与新对手下跳棋时赢的概…

用Python采用Modbus-Tcp的方式读取PLC模块数据

使用计算器得到需要的寄存器地址 这里PLC地址是83,对应的程序16进制读取地址是53 实际上由于PLC地址从1开始&#xff0c;所以这里实际地址应该是52&#xff0c;因为计算机从0开始 使用网络调试助手生成报文 使用Python中的内置函数int()。以下是将人员卡号’b’3b44’转换为十…

解决appium-doctor报gst-launch-1.0.exe and/or gst-inspect-1.0.exe cannot be found

一、下载gst-launch-1.0.exe and gst-inspect-1.0.exe 下载地址&#xff1a;Download GStreamer runtime installer 和 development installer 两个应用程序都要下载并安装 二、运行安装 下载好后点击安装会弹出如下界面&#xff0c;点击“更多信息”展开&#xff0c;点击“仍然…

拓宽“主航道”的Serverless与EDA领域,亚马逊云科技不断创新开拓

在新潮如走马灯般变换的时尚界&#xff0c;每隔几年就会刮起一阵复古风。被誉为“时尚教父”的著名设计师安德烈莱昂塔利曾说&#xff1a;“时尚总是在寻找新的灵感和方向&#xff0c;而复古是其中一个重要的来源。” 无独有偶。日新月异的高科技领域也会出现公认的“过时”…

msys2安装与配置: 在windows上使用linux工具链g++和包管理工具pacman C++开发

文章目录 为什么用这个msys2下载、doc安装&#xff0c;很简单初次运行&#xff0c;做些配置更新软件安装与卸载方法安装必要的软件包设置win环境变量在windows terminal中使用在vscode中使用 为什么用这个msys2 方便windows上的C开发demo&#xff0c;不需要VS了方便C开发安装o…

跨越山海,爱在滇西|拓数派为滇西孩子点亮科学梦想

近日&#xff0c;拓数派在共青团浙江大学委员会、景东县教育体育局和景东团县委等单位指导下开展“爱在滇西”2023年公益助学活动&#xff0c;并携手浙大国际科创中心、浙大微纳电子学院、启真科技控股公司和北京德恒律所共同向景东浙大求是中学捐赠爱心助学金&#xff0c;用于…

【RISC-V】昉·星光 2单板计算机初始调试记录

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

JavaSwing+MySQL的飞机订票系统(内含oracle版本)

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88055544 JDK1.8 MySQL5.7 功能&#xff1a;接收客户端发来的数据、处理客户端发来的数据、发送数据包到客户端&#xff1b;客户端&#xff1a;查询所有航班的信息、查看自己所定的票、订票…

mac批量提取文件夹的名称,怎么操作?

mac批量提取文件夹的名称&#xff0c;怎么操作&#xff1f;很多小伙伴想知道在mac电脑上可以一键快速批量的将大量文件夹的名提取出来&#xff0c;而不是采用一个一个名称提取的方法&#xff0c;这是一个有利于提高工作效率的办法&#xff0c;这一项技能在网上几乎找不到解决办…

cloudwatch agent通过squid代理上传指标到cloudwatch

1.安装cloudwatch agent代理 1.1、安装cloudwatch代理包 2.2、更改程序包的目录 3.3.创建cloudwatch代理配置文件 运行以下命令配置向导 sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard 按照提示选择个性化服务 2.安装squid服务器 简…

Git基本操作命令

** 创建仓库 **&#xff0c;用于被git管理 第一步&#xff1a; $ mkdir learngit $ cd learngit $ pwd /Users/michael/learngit第二步&#xff1a; 通过git init命令把这个目录变成Git可以管理的仓库&#xff1a; $ git init** 提交代码 **&#xff1a; 第一步&#xff…

JVM概述

1.什么是虚拟机&#xff1f; 虚拟机就是一台虚拟的计算机。它是一款软件&#xff0c;它分为系统虚拟机(比如VMware)和程序虚拟机(比如Java虚拟机)。 2.JVM的作用 Java虚拟机负责装载字节码文件到内部&#xff0c;编译为对应平台上的机器码指令来执行&#xff0c;还有自动的垃…

系统学习Linux-Rsync远程数据同步服务(三)

一、概述 rsync是linux 下一个远程数据同步工具 他可通过LAN/WAN快速同步多台主机间的文件和目录&#xff0c;并适当利用rsync 算法减少数据的传输 会对比两个文件的不同部分&#xff0c;传输差异部分&#xff0c;因此传输速度相当快 rsync可拷贝、显示目录属性&#xff0c…

透视表可视化简单案例

import pandas as pd import numpy as np import os basepath/Users/kangyongqing/Documents/kangyq/202307/标准版学期制C2/pathos.path.join(basepath,02freetime.csv) dtpd.read_csv(path,dtype{shifen:object}) print(dt.head()) import matplotlib.pyplot as pltfor i in …