• 浅析SpringBoot加载配置的6种方式


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

    说明

    Environment对象

    Environment 是 springboot 核心的环境配置接口,它提供了简单的方法来访问应用程序属性,包括系统属性、操作系统环境变量、命令行参数、和应用程序配置文件中定义的属性等等,使用 Environment 方式来获取配置属性值非常简单,只要注入Environment类调用其方法getProperty(属性key)即可

    @Value

    @Value注解是Spring框架提供的用于注入配置属性值的注解,它可用于类的成员变量、方法参数和构造函数参数上, 在应用程序启动时,使用 @Value 注解的 Bean 会被实例化。所有使用了 @Value 注解的 Bean 会被加入到
    PropertySourcesPlaceholderConfigurer 的后置处理器集合中。当后置处理器开始执行时,它会读取 Bean 中所有 @Value 注解所标注的值,并通过反射将解析后的属性值赋值给标有 @Value 注解的成员变量、方法参数和构造函数参数。重要!!! ⚠️注意 ①在使用 @Value 注解时需要确保注入的属性值已经加载到 Spring 容器中,否则会导致注入失败; ②建议引用变量的时候给定一个默认值,避免启动报“缺失配置”的错误; ③通过依赖注入的方式获取对象中属性值,切记不要使用new的方式来创建对象获取其属性。

    @ConfigurationProperties

    SpringBoot 提供的一种更加便捷来处理配置文件中的属性值的方式,可以通过自动绑定和类型转换等机制,将指定前缀的属性集合自动绑定到一个Bean对象上。

    @PropertySources

    @PropertySources 注解的实现原理相对简单,应用程序启动时扫描所有被该注解标注的类,获取到注解中指定自定义配置文件的路径,将指定路径下的配置文件内容加载到 Environment 中,这样可以通过 @Value 注解或 Environment.getProperty() 方法来获取其中定义的属性值了。默认只限读取properties文件内容,想加载yaml文件内容,可以自定义factory适配器,指定factory具体的使用

    YamlPropertiesFactoryBean对象

    只限读取yaml文件,通过 @Value 注解或 Environment.getProperty() 方法来配合着获取其中定义的属性值。

    JAVA原生

    通过java.util.Properties去加载配置文件中的属性,

    一、Environment

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

    1. @Slf4j
    2. @SpringBootTest
    3. public class EnvironmentTest {
    4. @Resource
    5. private Environment env;
    6. @Test
    7. public void var1Test() {
    8. String var1 = env.getProperty("env.var1");
    9. log.info("Environment获取的配置内容:{}", var1);
    10. }
    11. }

    二、@Value 注解

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

    1. @Slf4j
    2. @SpringBootTest
    3. public class EnvVariablesTest {
    4. @Value("${env.var1}")
    5. private String var1;
    6. @Test
    7. public void var1Test(){
    8. log.info("配置文件属性: {}",var1);
    9. }
    10. }

    三、@ConfigurationProperties 注解

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

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

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

    1. @Data
    2. @Configuration
    3. @ConfigurationProperties(prefix = "env")
    4. public class MyConf {
    5. private String var1;
    6. private String var2;
    7. }

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

    1. @Slf4j
    2. @SpringBootTest
    3. public class ConfTest {
    4. @Resource
    5. private MyConf myConf;
    6. @Test
    7. public void myConfTest() {
    8. log.info("@ConfigurationProperties注解获取的配置内容:{}", JSON.toJSONString(myConf));
    9. }
    10. }

    四、@PropertySources 注解

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

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

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

    1. @Data
    2. @Configuration
    3. @PropertySources({
    4. @PropertySource(value = "classpath:important.properties", encoding = "utf-8"),
    5. @PropertySource(value = "classpath:important.properties",encoding = "utf-8")
    6. })
    7. public class PropertySourcesConf {
    8. @Value("${env.var1}")
    9. private String var1;
    10. @Value("${env.var2}")
    11. private String var2;
    12. }

    五、YamlPropertiesFactoryBean 加载 YAML 文件

    1. @Configuration
    2. public class MyYamlConfig {
    3. @Bean
    4. public static PropertySourcesPlaceholderConfigurer yamlConfigurer() {
    5. PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
    6. YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
    7. yaml.setResources(new ClassPathResource("test.yml"));
    8. configurer.setProperties(Objects.requireNonNull(yaml.getObject()));
    9. return configurer;
    10. }
    11. }

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

    1. @Slf4j
    2. @SpringBootTest
    3. public class YamlTest {
    4. @Value("${env.var3}")
    5. private String var3;
    6. @Test
    7. public void myYamlTest() {
    8. log.info("Yaml获取配置内容:{}", var3);
    9. }
    10. }

    六、JAVA原生读取

    1. @Slf4j
    2. @SpringBootTest
    3. public class CustomTest {
    4. @Test
    5. public void customTest() {
    6. Properties props = new Properties();
    7. try {
    8. InputStreamReader inputStreamReader = new InputStreamReader(
    9. this.getClass().getClassLoader().getResourceAsStream("test.properties"),
    10. StandardCharsets.UTF_8);
    11. props.load(inputStreamReader);
    12. } catch (IOException e1) {
    13. System.out.println(e1);
    14. }
    15. log.info("Properties Name:" + props.getProperty("env.appName"));
    16. }
    17. }
  • 相关阅读:
    麒麟 ZYJ 服务器软件适配 参考示例
    Vue前端框架12 组件生命周期、生命周期的应用、动态组件、组件保持存活、异步组件、依赖注入、Vue应用原理
    Python 异步编程原理篇之新旧协程实现对比
    渲染器的设计
    【Go电商实战03】如何使用ORM链式操作?如何优雅的实现软删除?
    解析java中的String类中的常用方法(二)
    阿里云云原生一体化数仓 - 数据安全能力解读
    从零开始学习线性回归:理论、实践与PyTorch实现
    UMLChina建模知识竞赛第3赛季第13轮:SysML和系统工程知识
    m基于遗传优化算法的公式参数拟合matlab仿真
  • 原文地址:https://blog.csdn.net/qq_21305943/article/details/134433734