freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

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

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

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

FreeBuf+小程序

FreeBuf+小程序

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

从配置文件中获取属性应该是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)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者