此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

@Value

@Value通常用于注入外部化属性:spring-doc.cadn.net.cn

@Component
public class MovieRecommender {

	private final String catalog;

	public MovieRecommender(@Value("${catalog.name}") String catalog) {
		this.catalog = catalog;
	}
}
@Component
class MovieRecommender(@Value("\${catalog.name}") private val catalog: String)

使用以下配置:spring-doc.cadn.net.cn

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

还有以下内容application.properties文件:spring-doc.cadn.net.cn

catalog.name=MovieCatalog

在这种情况下,catalog参数和字段将等于MovieCatalog价值。spring-doc.cadn.net.cn

Spring 提供了默认的宽松嵌入值解析器。它将尝试解决 属性值,如果无法解析,则属性名称(例如${catalog.name}) 将作为值注入。如果您想对不存在的保持严格控制 values,则应声明PropertySourcesPlaceholderConfigurerbean,如下所示 示例显示:spring-doc.cadn.net.cn

@Configuration
public class AppConfig {

	@Bean
	public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
		return new PropertySourcesPlaceholderConfigurer();
	}
}
@Configuration
class AppConfig {

	@Bean
	fun propertyPlaceholderConfigurer() = PropertySourcesPlaceholderConfigurer()
}
配置PropertySourcesPlaceholderConfigurer使用 JavaConfig,@Bean方法必须是static.

如果无法解析任何占位符,则使用上述配置可确保 Spring 初始化失败。也可以使用类似${}setPlaceholderPrefix(),setPlaceholderSuffix(),setValueSeparator()setEscapeCharacter()以自定义占位符语法。此外,默认的 转义字符可以通过设置spring.placeholder.escapeCharacter.default属性通过 JVM 系统属性(或通过 这SpringProperties机制)。spring-doc.cadn.net.cn

Spring Boot 默认配置一个PropertySourcesPlaceholderConfigurerbean 那 将从application.propertiesapplication.yml文件。

Spring 提供的内置转换器支持允许简单的类型转换(到Integerint例如)自动处理。多个逗号分隔值可以是 自动转换为String数组,无需额外努力。spring-doc.cadn.net.cn

可以提供默认值,如下所示:spring-doc.cadn.net.cn

@Component
public class MovieRecommender {

	private final String catalog;

	public MovieRecommender(@Value("${catalog.name:defaultCatalog}") String catalog) {
		this.catalog = catalog;
	}
}
@Component
class MovieRecommender(@Value("\${catalog.name:defaultCatalog}") private val catalog: String)

SpringBeanPostProcessor使用ConversionService在幕后处理 转换String@Value到目标类型。如果你想 为自己的自定义类型提供转换支持,您可以提供自己的ConversionServicebean 实例,如以下示例所示:spring-doc.cadn.net.cn

@Configuration
public class AppConfig {

	@Bean
	public ConversionService conversionService() {
		DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
		conversionService.addConverter(new MyCustomConverter());
		return conversionService;
	}
}
@Configuration
class AppConfig {

	@Bean
	fun conversionService(): ConversionService {
		return DefaultFormattingConversionService().apply {
			addConverter(MyCustomConverter())
		}
	}
}

什么时候@Value包含一个SpEL表达该值将是动态的 在运行时计算,如以下示例所示:spring-doc.cadn.net.cn

@Component
public class MovieRecommender {

	private final String catalog;

	public MovieRecommender(@Value("#{systemProperties['user.catalog'] + 'Catalog' }") String catalog) {
		this.catalog = catalog;
	}
}
@Component
class MovieRecommender(
	@Value("#{systemProperties['user.catalog'] + 'Catalog' }") private val catalog: String)

SpEL 还支持使用更复杂的数据结构:spring-doc.cadn.net.cn

@Component
public class MovieRecommender {

	private final Map<String, Integer> countOfMoviesPerCatalog;

	public MovieRecommender(
			@Value("#{{'Thriller': 100, 'Comedy': 300}}") Map<String, Integer> countOfMoviesPerCatalog) {
		this.countOfMoviesPerCatalog = countOfMoviesPerCatalog;
	}
}
@Component
class MovieRecommender(
	@Value("#{{'Thriller': 100, 'Comedy': 300}}") private val countOfMoviesPerCatalog: Map<String, Int>)