繁体   English   中英

如何在我的普通代码中使用 application.yml 文件中的变量?

[英]How do I use a variable from an application.yml file in my normal code?

例如,假设在我的 yml 文件中有一个名为 indicator 的变量。 并且基于指标变量的值是什么,我希望代码做一些不同的事情。 我将如何访问常规代码中的 yml 变量并相应地使用它?

你可以使用这个:

@Value("${your.path.yml.string}")
private String x;

YML:

your:
  path:
    yml:
      string: hello

x 将是“你好”

  1. 您需要使用 Spring 表达式语言,它说我们应该把它写成
    @Value("${spring.application.name}") 
    private String appName;
  1. 如果 yaml/yml 或属性文件中不存在键,则为默认值
    @Value("${spring.application.name: defaultValue}") 
    private String appName;
  1. 最后一种获取价值的方法是使用环境 object
    @Autowired  
    private Environment environment;
       
    String appName = environment.get("spring.application.name");

您可以将@Value注释添加到 bean 中的任何字段。

@Value("$(path.to.your.variable)")
String myString;

也适用于构造函数。

public MyClass(@Value("$(path.to.your.variable)") String myString) {

您可以在字段或参数上使用@Value将属性分配给某个变量。

属性示例:

@Value("${indicator}")
private String indicator

参数示例:

private void someMethod(@Value("${indicator}") String indicator) {
    ...
}

然后,您可以根据需要使用指标

注意:您使用@Value的 class 应该是 Spring 组件

使用 Spring-Boot,您可以自动为您提供文件application.yml 您可以做的是在此文件中添加一个属性,例如:

my.properties: someValue

然后,在您的 Spring Bean 之一(使用@Component@Bean定义)中,您可以使用注释@Value检索此值。 然后,对这个变量做任何你想做的事情。

例如:

@Component
public class MyClass {

    @Value("${my.properties"}
    private String myProp; // will get "someValue" injected.

    ...


    // Just use it in a method
    public boolean myMethod() {
        if(myProp.equals("someValue") {
            // do something
        } else {
            // do something else
        } 
    }
}

最好的方法是不要在 Spring 和您的“正常”代码之间建立紧密耦合,而是使用正常的 Java 功能,如构造函数以及@Bean方法:

class MyService {
    final String indicatorName;

    MyService(String indicatorName) {
        this.indicatorName = indicatorName;
    }
}

...在您的配置中 class...

@Bean
MyService myService(@Value("indicator.name") String indicatorName) {
    return new MyService(indicatorName);
}

Spring Boot 的两个注意事项:

  • @ConfigurationProperties功能允许您将 map 属性添加到结构化的 Java 数据类上,并且通常比手动使用@Value更干净。
  • 始终使用您自己定义的命名空间属性以避免将来与其他库发生冲突,因此使用company.project.indicator.name代替indicator.name 我建议查看 Boot 中的DataSourceProperties以查看如何设置所有这些的示例。

但是,更广泛地说,当您说您希望代码“做一些不同的事情”时,听起来更好的选择可能是让不同的类在不同的情况下被激活。 Spring 配置文件和 Spring 引导自动配置都有助于执行此操作。

问题陈述可以重新定义为Java中的配置管理。

你应该有一个像 ConfigManager 这样的组件,它在你的应用程序启动时被实例化。 该组件将读取一个属性文件,即您的用例中的 yaml。 后续应用逻辑将从公开为简单键/值对的 ConfigManager 中获取这些值。

剩下的就是让您确定如何从 yaml 文件中读取和解析值。 这已经在这里得到了回答: Parse a YAML file

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM