Skip to content

手动获取配置文件中的信息的几种方式

  • 问题描述:在static方法里获取properties或者yml文件中无法通过@Vlaue获取配置文件中的信息,因为static的加载的时候,属性还没注入成功,所以获取的结果是null

  • 方式一:适用于启动Springboot时获取的场景

    java
    @SpringBootApplication(scanBasePackages = "com.ci")
    public class ApiApplication {
    
        public static void main(String[] args) {
            // 启动Spring应用
            ConfigurableApplicationContext context = SpringApplication.run(ApiApplication.class, args);
    
            // 获取Environment对象读取配置
            Environment env = context.getEnvironment();
            String serverPort = env.getProperty("server.port");
            String databaseUrl = env.getProperty("spring.datasource.url");
    
            System.out.println("Server Port: " + serverPort);
            System.out.println("Database URL: " + databaseUrl);
            
            // 关闭应用上下文(可选)
            context.close();
        }
    
    }
  • 方式二:适用于仅读取配置而不启动Spring的场景

    1. 添加依赖

      xml
      <dependency>
          <groupId>org.yaml</groupId>
          <artifactId>snakeyaml</artifactId>
          <version>1.30</version>
      </dependency>
    2. 读取配置文件

      java
      import org.yaml.snakeyaml.Yaml;
      import java.io.InputStream;
      import java.util.Map;
      
      public class ConfigReader {
          public static void main(String[] args) {
              Yaml yaml = new Yaml();
              try (InputStream inputStream = ConfigReader.class.getClassLoader()
                      .getResourceAsStream("application.yml")) {
                  
                  // 加载YAML为Map结构
                  Map<String, Object> config = yaml.load(inputStream);
                  
                  // 读取嵌套属性(示例:spring.datasource.url)
                  Map<String, Object> springConfig = (Map<String, Object>) config.get("spring");
                  Map<String, Object> datasourceConfig = (Map<String, Object>) springConfig.get("datasource");
                  String databaseUrl = (String) datasourceConfig.get("url");
                  
                  System.out.println("Database URL: " + databaseUrl);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }
  • 方式三:若需在静态方法中多次访问配置,可在启动后保存Environment

    java
    @SpringBootApplication(scanBasePackages = "com.ci")
    public class ApiApplication {
    
        private static Environment env;
    
        public static void main(String[] args) {
            ConfigurableApplicationContext context = SpringApplication.run(ApiApplication.class, args);
            env = context.getEnvironment();
    
            // 示例:在其他静态方法中使用
            printConfig();
    
            context.close();
        }
    
        public static void printConfig() {
            String port = env.getProperty("server.port");
            System.out.println("Static Access - Port: " + port);
        }
    }

MIT版权,未经许可禁止任何形式的转载