【问题标题】:Difference between System.getenv(/**vName**/) & Auto-wiring Environment and doing environment.getProperty("myProp");System.getenv(/**vName**/) & Auto-wiring Environment 和做 environment.getProperty("myProp"); 的区别
【发布时间】:2020-01-06 06:10:35
【问题描述】:

我知道System.getenv(/**vName**/) 获取附加了 vName 变量的环境属性,但我很好奇我们是否也可以使用下面的方法来达到相同的结果?

@Autowired
    private Environment environment;
environment.getProperty(/**vName**/);

有区别吗?我们什么时候应该使用哪一个?

代码正在运行

@Autowired
    private Environment env; <---**I am not sure how this env is getting used?**

    @Value("${someURLVriable}")
    String APIURLTest;

    @Bean(name = "restTemplate")
    public RestTemplate restTemplate(RestTemplateBuilder builder) {

        String env = System.getenv("environment");<--**eclipse giving warning here.**
        String baseURL = System.getenv("illustrationAPIURL");
        if (baseURL == null) {/** If baseURL comes null i.e it must be on local/test Env **/
            baseURL = APIURLTest;
            env = "DEV";
        }

        log.info("Environment loaded : {}.", env);
        log.info("loaded apiURL : {}.", baseURL);
        return builder.rootUri(baseURL).build();

    }

【问题讨论】:

  • 你好像少了一个弹簧相关的标签
  • 你指向@Bean 吗?帮我找到丢失的部分:)
  • 我不知道你是否可以在 Spring-boot 中自动装配环境,但你可以使用@Value-annotation。或者我最喜欢的:use properties- or yml-file in conjunction with environment varialbes and default values
  • 你也不应该使用。 比@Turing85 的建议更好,使用@ConfigurationProperties
  • @chrylis-onstrike- 我同意浅层次结构。但是,如果您有更深的层次结构,例如,这会让人难以嘲笑。

标签: java spring


【解决方案1】:

使用System.getenv("XYZ"),您只需访问操作系统的环境变量。如果你使用 Spring 的 Environment 抽象,你不仅可以在操作系统的环境变量中搜索你的属性,还可以在以下位置:

属性在几乎所有应用程序中都发挥着重要作用,并且可能 源自多种来源:属性文件、JVM 系统属性、系统 环境变量、JNDI、servlet 上下文参数、临时 Properties 对象、 地图等等。与属性相关的环境对象的作用是 为用户提供便捷的服务接口配置属性源 并从中解析属性。 - 环境接口的JavaDoc

所以 Spring 实际上会根据您正在运行的应用程序的活动配置文件搜索您请求的属性,并且会在更多的地方搜索,例如JNDI 或 ServletContextParameters。如果您不需要在多个地方额外搜索 Spring,只需注入一个环境变量(提示:系统属性-DmyName=foo 和环境变量之间存在差异FOO_BAR=duke),那么你可以直接使用System.getenv("XYZ")

【讨论】:

    【解决方案2】:

    您可以使用 Environment 解析值,并可以像这样读取 env 属性

    @SpringBootApplication
    public class Application implements CommandLineRunner {
    
        private static final Logger logger = LoggerFactory.getLogger(Application.class);
    
        @Autowired
        private Environment env;
    
        @Override
        public void run(String... args) throws Exception {
    
            logger.info("{}", env.getProperty("JAVA_HOME"));
            logger.info("{}", env.getProperty("app.name"));
        }
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    更新:

    在下面您将使用属性文件值,并将使用属性值,例如

    application.properties

    path: {HOME}/dir
    

    和代码:

    @SpringBootApplication
    public class Application implements CommandLineRunner {
    
        private static final Logger logger = LoggerFactory.getLogger(Application.class);
    
        @Value("${path}")
        private String path;
    
        @Override
        public void run(String... args) throws Exception {
           logger.info("value from property is: {}", path));
    
        }
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    更新: 而且,您可以在简单的 Java 类中使用 System.getEnv 方法,也不需要 spring 自动装配。

    【讨论】:

    • 是的,是的。我想知道这两种方法是否有区别。
    • 尽力而为,但有 3 个不同的东西。 1 自动装配环境变量 2. Sytem,getEnv 3.Sytem,getProp。您正在描述第三个。我正在寻找前 2 的差异。
    • System.getEnv 方法可以在简单的 Java 类中使用,也不需要 spring 自动装配。
    • 完全正确 :) 更新您的答案,我会投票表示赞赏
    • @Rishi:更新:)
    猜你喜欢
    • 2016-11-12
    • 2014-02-07
    • 2012-10-18
    • 2016-08-02
    • 2012-01-28
    • 2019-04-19
    • 1970-01-01
    • 2010-09-29
    相关资源
    最近更新 更多