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

时间:2018-01-30 10:09:21

标签: java spring properties mapping

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

Application.java

@SpringBootApplication
@EnableConfigurationProperties
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

DemoProperties.java

@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;
    }
}

test.properties

test.name=myNameGood

application.properties

test.name=myNameBad

ApplicationTests.java

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Autowired
    DemoProperties demoProperties;

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

}

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

1 个答案:

答案 0 :(得分:1)

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

从Spring Boot文档:

  

72.3 Change the location of external properties of an application

     

增加和修改它的一个好方法是添加@PropertySource   应用程序源的注释。传递给的类   SpringApplication静态便捷方法,以及那些添加使用的方法   检查setSources()以查看它们是否具有@PropertySources,以及   如果他们这样做,那么这些属性会尽早添加到环境中   用于ApplicationContext生命周期的所有阶段。   以这种方式添加的属性的优先级低于任何添加的属性   默认位置(例如application.properties),系统   属性,环境变量或命令行。

这个优先级是有意义的,因为您可以在运行时提供的配置(例如application.properties)应始终能够覆盖配置"硬编码"在申请中。

  

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

要测试一个类或一个行为,你应该写一个单元测试 您可以使用以下方法之一覆盖application.properties值:

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

  • 使用@TestPropertySource。来自javadoc:

  

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