SpringBoot中使用 PropertySourcesPlaceholderConfigurer

在 Spring 框架中,属性占位符是 XML 或属性配置文件中用来表示值的变量。运行时,Bean 后处理器会用实际值替换属性占位符。

PropertySourcesPlaceholderConfigurer 是一个 Bean 后处理器,它通过查找和替换属性源中的相应值来解析 ${mail.host} 等占位符。

在本教程中,我们将学习如何在 Spring 应用程序中配置 PropertySourcesPlaceholderConfigurer。

通过将 PropertySourcesPlaceholderConfigurer 声明为 bean,可以启用它,如下所示。

@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {

 @Bean
 public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
   return new PropertySourcesPlaceholderConfigurer();
 }
}

@PropertySource 注解用于 @Configuration 类,通过指定文件位置将属性文件加载到 Spring 环境中。

请看 application.properties 文件中的以下键值属性。

person.first.name=John
person.last.name=Doe
person.full.name=${person.first.name} ${person.last.name}

在初始化阶段,Spring 容器会加载 Bean 定义、配置和属性源,然后 Bean 后处理器 PropertySourcesPlaceholderConfigurer 会解析占位符值。例如,它将 ${person.first.name} 和 ${person.last.name} 占位符分别替换为 John 和 Doe 值。


解析占位符并实例化 Spring 应用程序上下文后,可从 Spring 的环境中获取属性值,如下所示。

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
Environment environment = applicationContext.getEnvironment();
assertEquals("John", environment.getProperty("person.first.name"));
assertEquals(
"Doe", environment.getProperty("person.last.name"));
assertEquals(
"John Doe", environment.getProperty("person.full.name"));

配合@Value使用
在 Spring 中,@Value 注解用于将来自属性源、环境变量和其他外部源的值直接注入 Bean 的字段中。

例如,可以使用 @Value 注解注入 application.properties 中的值,方法是指定占位符,如下所示。

public class Person {

 @Value("${person.first.name}")
 private String firstName;

 @Value(
"${person.last.name}")
 private String lastName;

 @Value(
"${person.full.name}")
 private String fullName;

 
// Getter methods
}

如果属性文件中没有指定值,默认解析器会将占位符作为值注入字段。

例如,如果我们从 application.properties 文件中删除 person.full.name 属性,那么默认解析器就会将 ${person.full.name} 作为值注入 Person Bean 的 fullName 字段。

如果要对不存在的值进行严格验证,则可以将 PropertySourcesPlaceholderConfigurer 声明为配置类中的一个 Bean,如教程第二部分所示。

最后,您可以按如下方法测试注入 Person Bean 的值。

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
Person person = applicationContext.getBean(Person.class);
assertEquals("John", person.getFirstName());
assertEquals(
"Doe", person.getLastName());
assertEquals(
"John Doe", person.getFullName());