Java 为什么存在application.properties时不使用@PropertySource?
我所处的情况需要将一个具有某些属性(最终包含ID和电子邮件地址列表)的文件映射到HashMap。在春季,我发现属性文件可以映射到具有Java 为什么存在application.properties时不使用@PropertySource?,java,spring,properties,mapping,Java,Spring,Properties,Mapping,我所处的情况需要将一个具有某些属性(最终包含ID和电子邮件地址列表)的文件映射到HashMap。在春季,我发现属性文件可以映射到具有@ConfigurationProperties和@PropertySource的对象。为了测试这个机制,我创建了一个测试项目,但是当默认的application.properties文件存在时,@PropertySource似乎被忽略。我想知道这是怎么可能的,我如何解决它,使它使用指定的属性文件 Application.java @SpringBootApplic
@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
在此之前已绑定。感谢您提供的文档,愚蠢的是我没有想到这一点。您对解决方案有什么建议吗?