Spring中的值注释中的占位符支持

@Value批注中的${...}占位符用于访问在@PropertySource注册的属性。 这对于Spring应用程序中的@Configuration bean非常有用,但不仅如此。 为确保可行, PropertySourcesPlaceholderConfigurer必须存在于所有需要占位符解析的应用程序上下文中。

在此博客文章中,您将学习如何在Spring 4应用程序中配置占位符分辨率,以及如何使用@Value注释注入不同类型的对象,包括JSR-310 Date-Time,JSR-354 Money&Currency或java.util.Optional

注册

在没有XML配置的Spring应用程序中,必须在所有应用程序上下文中注册静态PropertySourcesPlaceholderConfigurer Bean。

要注册PropertySourcesPlaceholderConfigurer只需将相同类型的静态bean与要访问的属性源一起添加到配置中。 要导入多个属性源,请使用@PropertySources批注(Java 8之前的版本)或多个@PropertySource批注(Java 8)。

@Configuration
@PropertySource("classpath:application.properties")
@ComponentScan
class ApplicationConfig {

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

}

将属性源添加到配置程序的另一种方法是调用其setLocation方法:

@Configuration
@ComponentScan
class ApplicationConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        PropertySourcesPlaceholderConfigurer c = new PropertySourcesPlaceholderConfigurer();
        c.setLocation(new ClassPathResource("application.properties"));
        return c;
    }

}

注入简单属性

现在,您可以使用@Value批注和占位符轻松访问属性:

@Value("${my.string.property}")
private String stringProperty;
@Value("${my.int.property}")
private int intProperty;
@Value("${my.boolean.property}")
private boolean boolProperty;

这些属性在application.properties文件中定义:

my.string.property=Some text
my.int.property=42
my.boolean.property=true

当无法解析该属性时,您将获得异常:

java.lang.IllegalArgumentException: Could not resolve placeholder 'placeholder' in string value "${placeholder}"

忽略无法解析的占位符

如果要自动忽略所有无法解析的占位符,请设置配置程序的适当标志:

PropertySourcesPlaceholderConfigurer c = new PropertySourcesPlaceholderConfigurer();

c.setIgnoreUnresolvablePlaceholders(true);

默认值

可以使用以下语法提供默认值:

@Value("${my.string.property:Sample}")
private String stringProperty;

还支持空的默认值,这将导致一个空的stringProperty

@Value("${my.string.property:}")
private String stringProperty;

空值

如果希望将空值视为null ,则可以设置配置器的nullValue属性,如下所示:

PropertySourcesPlaceholderConfigurer c = new PropertySourcesPlaceholderConfigurer();
c.setNullValue("");

这可能会有所帮助,尤其是在使用java.util.Optional (请参见下文)。

注入非简单属性

要使用@Value批注注入复杂的属性,您需要在应用程序上下文中提供Spring的ConversionService 。 注册默认转换服务可以注入列表,数组和其他可转换类型。 通常,在Spring的servlet上下文中,将注册ConversionService (例如,通过@EnableWebMvc ),但是为了手动注册,可以使用以下代码。 请注意,bean的名称必须为conversionService

@Bean
public static ConversionService conversionService() {
    return new DefaultFormattingConversionService();
}

DefaultFormattingConversionService支持所有常见的转换器和格式化程序,包括JSR-354货币和货币,JSR-310日期时间和/或Joda-Time的格式化程序。

注入列表/数组

要从属性插入列表或数组,请使用逗号分隔的字符串定义属性的值:

my.intList.property=1,2,3,4,5
my.stringArray.property=1,2,3,4,5

然后像这样注入它们:

@Value("${my.intList.property}")
private List<Integer> intList;

@Value("${my.stringArray.property}")
private List<Integer> stringArray;

注入java.util.Optional

Java 8的Optional提供了使用可选属性的绝佳机会。 使用@Value注入Optional@Value是,必须将属性值解析为null值,并且要实现必须相应地设置配置程序的nullValue属性(如先前所示)。

@Value("${my.optional.property:}")
private Optional<String> optional;

如果没有属性my.optional.property ,则optional将包含Optional.empty ,因此可以在代码中很好地使用它:

if (optional.isPresent()) {
    // do something cool
}

注入

注册的ConversionService包含JSR-310日期时间的格式化程序。 以下示例适用于当前语言环境中的LocalDateLocalDateTime

# format for en_US locale
my.localDate.property=9/28/15
my.localDateTime.property=9/28/15 10:05 PM
@Value("${my.localDate.property}")
private LocalDate localDate;
@Value("${my.localDateTime.property}")
private LocalDateTime localDateTime;

注入

javax.money放在类路径上后,就可以注入MonetaryAmountCurrencyUnit

my.monetaryAmount.property=USD 299
my.currencyUnit.property=USD
@Value("${my.monetaryAmount.property}")
private MonetaryAmount monetaryAmount;
@Value("${my.currencyUnit.property}")
private CurrencyUnit currencyUnit;

注入自定义类型

使用ConversionService ,注册自定义转换器相对容易。 在下面的示例java.util.Pattern将从字符串值my.pattern.property=[0-9].*创建java.util.Pattern对象。 为了实现这一点,我们需要添加自定义转换:

DefaultFormattingConversionService cs = new DefaultFormattingConversionService();

cs.addConverter(String.class, Pattern.class, (Converter<String, Pattern>) Pattern::compile);

现在可以像下面这样注入属性:

@Value("${my.pattern.property}")
private Pattern pattern;

附加功能–在Thymeleaf视图中访问Spring的属性

如果您正在使用Thymeleaf,并且想要访问在Spring的环境中注册的属性(使用PropertySourcesPlaceholderConfigurer或仅使用@PropertySource ),则可以使用Thymeleaf的功能,使用SpringEL的语法:$ {@ myBean.doSomething()}。 所有属性都可以通过Environment接口使用,因此在Thymeleaf中访问它就像调用其getProperty方法一样简单:

<div th:fragment="footer" th:align="center">
    <span th:text="${@environment.getProperty('app.version')}"></span>
 </div>

结束语

您可以在我的Spring的快速入门原型中找到@Value注释和PropertySourcesPlaceholderConfigurer一些简单用法: https : //github.com/kolorobot/spring-mvc-quickstart-archetype

如果您使用的是Spring Boot,则可能需要阅读有关类型安全配置属性的信息: http : //docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-类型安全配置属性

翻译自: https://www.javacodegeeks.com/2015/09/placeholders-support-in-value-annotations-in-spring.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值