@ConfigurationProperties vs @PropertySource vs @Value

2022-09-03 18:33:46

我是春季/春季靴子的新手。我想在Java文件中使用/的键值对数据。我知道我们可以在任何POJO类中使用来设置字段或文件的默认值。application.propertiesapplication.yml@Valueapplication.propertiesapplication.yml

Q1) 但是为什么我们需要另外两个呢? 和。@ConfigurationProperties@PropertySource

Q2) 和 ,两者都可用于加载 或 中提到的外部数据?还是任何限制?@ConfigurationProperties@PropertySourceapplication.propertiesapplication.yml

PS:我试图在互联网上搜索,但没有得到明确的答案。


答案 1

@ConfigurationProperties用于使用 POJO bean 映射属性。然后,您可以使用 Bean 访问应用程序中的属性值。

@PropertySource是引用属性文件并加载它。

@Value是通过其键注入特定的属性值。


答案 2

@Value("${spring.application.name}")如果 application.properties/yml 文件中没有匹配的键,@Value将引发异常。它严格注入属性值。

例如:抛出以下异常,因为属性文件中不存在字段。@Value("${spring.application.namee}")namee

application.properties file
----------------------
spring:
  application:
    name: myapplicationname


org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testValue': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.application.namee' in value "${spring.application.namee}"

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.application.namea' in value "${spring.application.namee}"

@ConfigurationProperties(prefix = "myserver.allvalues")注入POJO属性,它并不严格,如果属性文件中没有键,它将忽略属性。

例如:

@ConfigurationProperties(prefix = "myserver.allvalues")
public class TestConfigurationProperties {
    private String value;
    private String valuenotexists; // This field doesn't exists in properties file
                                   // it doesn't throw error. It gets default value as null
}

application.properties file
----------------------
myserver:
  allvalues:
    value:  sampleValue

推荐