Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么存在application.properties时不使用@PropertySource?_Java_Spring_Properties_Mapping - Fatal编程技术网

Java 为什么存在application.properties时不使用@PropertySource?

Java 为什么存在application.properties时不使用@PropertySource?,java,spring,properties,mapping,Java,Spring,Properties,Mapping,我所处的情况需要将一个具有某些属性(最终包含ID和电子邮件地址列表)的文件映射到HashMap。在春季,我发现属性文件可以映射到具有@ConfigurationProperties和@PropertySource的对象。为了测试这个机制,我创建了一个测试项目,但是当默认的application.properties文件存在时,@PropertySource似乎被忽略。我想知道这是怎么可能的,我如何解决它,使它使用指定的属性文件 Application.java @SpringBootApplic

我所处的情况需要将一个具有某些属性(最终包含ID和电子邮件地址列表)的文件映射到HashMap。在春季,我发现属性文件可以映射到具有
@ConfigurationProperties
@PropertySource
的对象。为了测试这个机制,我创建了一个测试项目,但是当默认的
application.properties
文件存在时,
@PropertySource
似乎被忽略。我想知道这是怎么可能的,我如何解决它,使它使用指定的属性文件

Application.java

@SpringBootApplication
@EnableConfigurationProperties
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
@Component
@Configuration
@ConfigurationProperties("test")
@PropertySource("classpath:test.properties")
public class DemoProperties {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Autowired
    DemoProperties demoProperties;

    @Test
    public void contextLoads() {
        System.out.println(demoProperties.getName());
    }

}
DemoProperties.java

@SpringBootApplication
@EnableConfigurationProperties
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
@Component
@Configuration
@ConfigurationProperties("test")
@PropertySource("classpath:test.properties")
public class DemoProperties {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Autowired
    DemoProperties demoProperties;

    @Test
    public void contextLoads() {
        System.out.println(demoProperties.getName());
    }

}
测试属性

test.name=myNameGood
test.name=myNameBad
应用程序属性

test.name=myNameGood
test.name=myNameBad
ApplicationTests.java

@SpringBootApplication
@EnableConfigurationProperties
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
@Component
@Configuration
@ConfigurationProperties("test")
@PropertySource("classpath:test.properties")
public class DemoProperties {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Autowired
    DemoProperties demoProperties;

    @Test
    public void contextLoads() {
        System.out.println(demoProperties.getName());
    }

}

因此,当存在
application.properties
时,此测试将打印
myNameBad
,但当我删除或重命名该文件时,输出为
myNameGood
(这是需要的)。

来自默认位置的属性(此处为
application.properties)
作为类中使用的自定义属性具有更高的优先级。

从Spring引导文档中:

一个很好的扩充和修改方法是添加@PropertySource 应用程序源的注释。课程转到 SpringApplication静态便利方法,以及使用 检查setSources()是否有@PropertySources,以及 如果这样做,那么这些属性将尽早添加到环境中 用于ApplicationContext生命周期的所有阶段。 以这种方式添加的属性的优先级低于使用 默认位置(例如application.properties)、系统 属性、环境变量或命令行。

这个优先级是有意义的,因为您可以在运行时提供的配置(例如
应用程序.properties
)应该始终能够覆盖应用程序中的“硬编码”配置


为了测试这个机制,我创建了一个测试项目

要测试类或行为,您应该编写单元测试。
因此,您可以使用以下方法之一覆盖
应用程序。属性
值:

  • test.properties
    重命名为
    application.properties
    并将其移动到
    src/test/resources

  • 使用。从javadoc:

测试属性源的优先级高于从中加载的属性源 操作系统的环境或Java系统属性 作为应用程序通过声明方式添加的属性源 @PropertySource或以编程方式


这是不容忽视的。它被覆盖了。如果两者的属性相同,则application.properties中的属性具有更高的优先级。尝试添加具有不同名称和名称的变量check@pvpkiran更改变量是可行的,但我仍然不明白为什么在我的示例中会覆盖它。那么指定属性源有什么意义呢?
@ConfigurationProperties
仅适用于Spring boot加载的属性,即来自默认
应用程序的属性。properties
和friends。它不适用于加载了
@PropertySource
的属性,这些属性稍后将在过程中加载,并且
@ConfigurationProperties
在此之前已绑定。感谢您提供的文档,愚蠢的是我没有想到这一点。您对解决方案有什么建议吗?