【问题标题】:Read environment variable in SpringBoot在 Spring Boot 中读取环境变量
【发布时间】:2017-12-01 20:39:44
【问题描述】:

SpringBoot 中读取环境变量的最佳方法是什么?
在 Java 中,我使用:

String foo = System.getenv("bar");

使用@Value注解可以做到吗?

【问题讨论】:

    标签: java spring spring-boot environment-variables


    【解决方案1】:

    引用the documentation:

    Spring Boot 允许您将配置外部化,以便您可以在不同的环境中使用相同的应用程序代码。您可以使用属性文件、YAML 文件、环境变量和命令行参数来外部化配置。属性值可以使用@Value 注释直接注入您的bean,通过Spring 的Environment 抽象访问或通过@ConfigurationProperties 绑定到结构化对象。

    所以,既然 Spring boot 允许你使用环境变量进行配置,而且 Spring boot 还允许你使用@Value 从配置中读取一个属性,那么答案是肯定的。


    例如,以下将给出相同的结果:

    @Component
    public class TestRunner implements CommandLineRunner {
        @Value("${bar}")
        private String bar;
        private final Logger logger = LoggerFactory.getLogger(getClass());
        @Override
        public void run(String... strings) throws Exception {
            logger.info("Foo from @Value: {}", bar);
            logger.info("Foo from System.getenv(): {}", System.getenv("bar")); // Same output as line above
        }
    }
    

    【讨论】:

      【解决方案2】:

      你可以用@Value注解来做到这一点:

      @Value("${bar}")
      private String myVariable;
      

      如果没有找到,也可以使用冒号给出默认值:

      @Value("${bar:default_value}")
      private String myVariable;
      

      【讨论】:

        【解决方案3】:

        下面是三个“占位符”语法,可用于访问名为MY_SECRET 的系统环境变量:

        @Value("${MY_SECRET:aDefaultValue}")
        private String s1;
        
        @Value("#{environment.MY_SECRET}")
        private String s2;
        
        @Value("${myApp.mySecretIndirect:aDefaultValue}") // via application property
        private String s3;
        

        在第三种情况下,占位符在属性文件中引用已从系统环境初始化的应用程序属性:

        myApp.mySecretIndirect=${MY_SECRET:aDefaultValue}
        

        要使@Value 工作,它必须在实时@Component(或类似的)中使用。如果您希望它在单元测试期间工作,还有额外的 gochas - 请参阅我对Why is my Spring @Autowired field null?的回答

        【讨论】:

        • 注意#{${在使用environment.时的不同标点符号。
        • 我认为你有一个错字 @Value("#{environment.MY_SECRET}") 应该是 $
        • @dgraf,请参阅之前的评论(由我)——这是故意的。这是一种晦涩难懂的功能,但您可以通过查找 Spring Expression Language (SpEL) 找到它的文档。
        【解决方案4】:

        或者,您可以使用org.springframework.core.env.Environment 接口访问环境变量:

        import org.springframework.core.env.Environment;
        
        @Autowired
        private Environment env;
        
        //...
        
        System.out.println(env.getProperty("bar"));
        

        Read more...

        【讨论】:

          【解决方案5】:

          您可以将它与@Components 和@service 类的@Value 注解一起使用 如果是普通班,有时它不会起作用

          例子:

          @Component
          public class Testclass{
              @Value("${MY_SECRET:aDefaultValue}")
              private String test1;
          
              @Value("#{environment.MY_SECRET}")
              private String test1;
          
              @Value("${myApp.mySecretIndirect:aDefaultValue}")
              private String test1;
          
              //to get the properties list whih are in "," seperated
              @Value("${my.list.of.strings}")
              private List<String> myList;
          }
          

          【讨论】:

            【解决方案6】:

            是的,你可以。不过大部分回答都没有提到,顺序很重要,请查看https://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/html/boot-features-external-config.html

            您的OS environment variables 将覆盖来自Application properties packaged inside your jar (application.properties and YAML variants). 的值,因此基本上,您的环境变量具有更高的优先级。

            【讨论】:

              【解决方案7】:

              您可以将环境变量放在 application.yml/application.properties 文件中,然后您可以使用 @Value 注释获取值。 但是为了使用@Value注解,你的类应该是一个bean并且应该使用@Component注解进行注解。 您还可以为变量提供默认值。

              @Component
              @NoArgsConstructor
              @Scope(BeanDefinition.SCOPE_PROTOTYPE)
              public class MyClass {
               
              @Value("${something.variable:<default-value>}")
              private String myEnvVariable;
              
              }
                  
              

              【讨论】:

                【解决方案8】:

                首先要在properties配置文件中定义相关的字段信息,然后使用@value来获取和使用 示例:

                @Value("${abc}")
                private String abc;
                

                【讨论】:

                  猜你喜欢
                  • 2020-05-05
                  • 2018-04-12
                  • 2022-07-29
                  • 2019-08-03
                  • 2021-07-16
                  • 2020-01-18
                  • 2020-09-15
                  • 1970-01-01
                  • 2021-11-09
                  相关资源
                  最近更新 更多