如何使用 Spring Boot PropertySource 读取外部配置文件

How to use SpringBoot PropertySource to read from an external configuration file

我创建了一个配置 class 来存储配置值。这些配置值应该从配置文件“config.properties”中读入。下面是配置 class:

@Configuration
@ComponentScan(basePackages = {"com.boot.Training.*"})
@PropertySource("file:/src/main/java/config.properties")
public class AppConfig {

    @Value("${myFirstName}")
    private static String myFirstName;

    @Value("${myLastName}")
    private static String myLastName;

    public static void showVariables() {
        System.out.println("firstName: " + myFirstName);
        System.out.println("lastName: " + myLastName);
    }

}

下面是 config.properties 文件的内容:

myFirstName=John    
myLastName=Doe

运行 我的程序应该简单地打印这些变量的值。但是相反,Eclipse 告诉我它找不到 config.properties 文件,即使我指定它位于 /src/main/java/config.properties 中。

我可能会在不考虑其他因素的情况下指定文件位置。我在这里错过了什么?

您使用的位置 (file:/src/main/java/config.properties) 是指绝对路径,而不是相对于您的项目主页的路径。

一种更常见的方法是将 config.properties 作为资源目录中项目的一部分发布,并通过类路径引用它。如果你把它移动到/src/main/resources/config.properties,你可以这样加载它:

@PropertySource("classpath:config.properties")

我相信理论上你可以将它留在 /src/main/java 并将你的 @PropertySource 位置更改为我上面的位置,但是将它移动到 /resources 是更惯用的方式这样做。

指定 file: 位置以指定位于主机环境其他位置的属性文件的基本方法是:

@PropertySource("file:/path/to/application.properties")
  • 请注意,/path/to/application.properties 应该是指向您的 .properties 文件的绝对路径(在您的示例中,您混合了 file: 用法和 相对路径 这是不正确的 )

也可以指定一个系统属性或一个环境变量,它们将被解析为它的实际值当您的应用程序启动时。例如,下面的 ${CONF_DIR} 将在 Spring 应用程序启动时替换为其关联的值:

  1. 在任何文本编辑器(如 nano 或 gedit)中打开 /etc/environment 并添加以下行:

    CONF_DIR=/path/to/directory/with/app/config/files
    
  2. 检查是否设置了系统变量:

    echo $CONF_DIR
    /path/to/directory/with/app/config/files
    
  3. 像这样使用 PropertySource:

    @PropertySource("file:${CONF_DIR}/application.properties")