freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

浅析SpringBoot加载配置的6种方式 | 京东云技术团队
京东云技术团队 2023-10-30 09:51:19 116877

从配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一,但就是这么常用的功能,仍然有很多开发者抓狂~今天带大家简单回顾一下这六种的使用方式:

说明
Environment对象Environment 是 springboot 核心的环境配置接口,它提供了简单的方法来访问应用程序属性,包括系统属性、操作系统环境变量、命令行参数、和应用程序配置文件中定义的属性等等,使用 Environment 方式来获取配置属性值非常简单,只要注入Environment类调用其方法getProperty(属性key)即可
@Value@Value注解是Spring框架提供的用于注入配置属性值的注解,它可用于类的成员变量、方法参数和构造函数参数上, 在应用程序启动时,使用 @Value 注解的 Bean 会被实例化。所有使用了 @Value 注解的 Bean 会被加入到 PropertySourcesPlaceholderConfigurer 的后置处理器集合中。当后置处理器开始执行时,它会读取 Bean 中所有 @Value 注解所标注的值,并通过反射将解析后的属性值赋值给标有 @Value 注解的成员变量、方法参数和构造函数参数。重要!!!⚠️注意 ①在使用 @Value 注解时需要确保注入的属性值已经加载到 Spring 容器中,否则会导致注入失败; ②建议引用变量的时候给定一个默认值,避免启动报“缺失配置”的错误; ③通过依赖注入的方式获取对象中属性值,切记不要使用new的方式来创建对象获取其属性。
@ConfigurationPropertiesSpringBoot 提供的一种更加便捷来处理配置文件中的属性值的方式,可以通过自动绑定和类型转换等机制,将指定前缀的属性集合自动绑定到一个Bean对象上。
@PropertySources@PropertySources 注解的实现原理相对简单,应用程序启动时扫描所有被该注解标注的类,获取到注解中指定自定义配置文件的路径,将指定路径下的配置文件内容加载到 Environment 中,这样可以通过 @Value 注解或 Environment.getProperty() 方法来获取其中定义的属性值了。默认只限读取properties文件内容,想加载yaml文件内容,可以自定义factory适配器,指定factory具体的使用
YamlPropertiesFactoryBean对象只限读取yaml文件,通过 @Value 注解或 Environment.getProperty() 方法来配合着获取其中定义的属性值。
JAVA原生通过java.util.Properties去加载配置文件中的属性,

一、Environment

注入Environment类调用其方法getProperty(属性key)即可

@Slf4j@SpringBootTestpublicclassEnvironmentTest{@ResourceprivateEnvironmentenv;@Testpublicvoidvar1Test(){Stringvar1 =env.getProperty("env.var1");log.info("Environment获取的配置内容:{}",var1);}}

二、@Value 注解

只要在变量上加注解 @Value("${env.var1}")就可以了,@Value 注解会自动将配置文件中的env.var1属性值注入到var1字段中。

@Slf4j@SpringBootTestpublicclassEnvVariablesTest{@Value("${env.var1}")privateStringvar1;@Testpublicvoidvar1Test(){log.info("配置文件属性: {}",var1);}}

三、@ConfigurationProperties 注解

在 application.yml 配置文件中添加配置项:

env:
  var1: 变量值1
  var2: 变量值2

创建一个 MyConf 类用于承载所有前缀为env的配置属性。

@Data@Configuration@ConfigurationProperties(prefix ="env")publicclassMyConf{privateStringvar1;privateStringvar2;}

在需要使用var1、var2属性值的地方,将 MyConf 对象注入到依赖对象中即可。

@Slf4j@SpringBootTestpublicclassConfTest{@ResourceprivateMyConfmyConf;@TestpublicvoidmyConfTest(){log.info("@ConfigurationProperties注解获取的配置内容:{}",JSON.toJSONString(myConf));}}

四、@PropertySources 注解

在 src/main/resources/ 目录下创建自定义配置文件 important.properties,增加两个属性。

env.var1=变量值1
env.var2=变量值2

在需要使用自定义配置文件的类上添加 @PropertySources 注解,注解 value属性中指定自定义配置文件的路径,可以指定多个路径,用逗号隔开。

@Data@Configuration@PropertySources({@PropertySource(value ="classpath:important.properties",encoding ="utf-8"),@PropertySource(value ="classpath:important.properties",encoding ="utf-8")})publicclassPropertySourcesConf{@Value("${env.var1}")privateStringvar1;@Value("${env.var2}")privateStringvar2;}

五、YamlPropertiesFactoryBean 加载 YAML 文件

@ConfigurationpublicclassMyYamlConfig{@BeanpublicstaticPropertySourcesPlaceholderConfigureryamlConfigurer(){PropertySourcesPlaceholderConfigurerconfigurer =newPropertySourcesPlaceholderConfigurer();YamlPropertiesFactoryBeanyaml =newYamlPropertiesFactoryBean();yaml.setResources(newClassPathResource("test.yml"));configurer.setProperties(Objects.requireNonNull(yaml.getObject()));returnconfigurer;}}

可以通过 @Value 注解或 Environment.getProperty() 方法来获取其中定义的属性值。

@Slf4j@SpringBootTestpublicclassYamlTest{@Value("${env.var3}")privateStringvar3;@TestpublicvoidmyYamlTest(){log.info("Yaml获取配置内容:{}",var3);}}

六、JAVA原生读取

@Slf4j@SpringBootTestpublicclassCustomTest{@TestpublicvoidcustomTest(){Propertiesprops =newProperties();try{InputStreamReaderinputStreamReader =newInputStreamReader(this.getClass().getClassLoader().getResourceAsStream("test.properties"),StandardCharsets.UTF_8);props.load(inputStreamReader);}catch(IOExceptione1){System.out.println(e1);}log.info("Properties Name:"+props.getProperty("env.appName"));}}

作者:京东零售 马宏伟

来源:京东云开发者社区 转载请注明来源

# 网络安全 # 系统安全 # 数据安全 # Spring # Spring Boot
本文为 京东云技术团队 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
京东云技术团队 LV.10
最懂产业的云
  • 1738 文章数
  • 91 关注者
高并发场景下的库存管理,理论与实战能否兼得?
2025-03-24
高并发场景下的库存管理,理论与实战能否兼得?
2025-03-24
引入JaCoCo导致的类型转换问题分析
2025-03-24