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 {@Beanpublic static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {return new PropertySourcesPlaceholderConfigurer();}}

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

@Configuration
@ComponentScan
class ApplicationConfig {@Beanpublic 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1688学python学不会_还在害怕学不会Python嘛?这篇文章让你瞬间读懂Python入门!...

零基础学习Python能学会吗?这个问题几乎是所有初学Python的小白都会问到的问题。其实Python是非常适合初学者入门的&#xff0c;相较于其他主流类编程语言&#xff0c;Python具有更好的可读性&#xff0c;因此上手更容易&#xff0c;而且即便你是零基础也一样能学会。献给Pyth…

elisa标准曲线怎么做_ELISA标准曲线绘制

● 设置标准曲线样品的标准浓度范围要有一个比较大的跨度&#xff0c;并且要能涵盖你所要检测实验样品的浓度&#xff0c;样品的浓度要在标准曲线浓度范围之内&#xff0c;包括上限和下限。而对于呈S型的标准曲线&#xff0c;尽量要使实验样品的浓度在中间坡度最陡段&#xff0…

如果今天完成,ESB会是什么样子?

JavaOne 2015即将结束&#xff0c;这又是一次很棒的社区活动。 我和Rafael进行了两次会议和HOL 。 我最喜欢的会议之一实际上是&#xff1a;关于ESB&#xff08;如果今天完成的话&#xff09;的样子。 我以为那是过去&#xff1f; 我通常也倾向于这样说。 但是&#xff0c;系统…

线程间的通信 设置线程等待与线程唤醒

代码实现上述框图&#xff1a; 1 //等待唤醒机制2 3 /*4 wait(),notify(),notifyAll()必须用在同步中&#xff0c;因为同步中才有锁。5 指明让持有那个锁的线程去等待或被唤醒&#xff0c;例如object.wait(),表明让持有object这把锁的线程等待。6 7 wait():让线程进入等待状态&…

python sys干嘛的_Python之sys模块

Sys模块函数之多&#xff0c;我只能选取自己认为比较实用的一些函数列在此处。借马云找员工的说法,”找最合适的而不是最天才的”&#xff0c;这句话&#xff0c;我个人觉得在很多方面都能适应&#xff0c;学习也不在话下。Sys模块功能的确很多&#xff0c;但我们应该将重点放在…

centos6.8升级python3.5.2

1.查看系统python版本 [rootmyserver01 Python-3.5.2]# python -V Python 2.6.6 2.升级3.5.2 A.下载&#xff1a;wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz 或者在浏览器下载&#xff08;选择Linux/UNIX平台&#xff0c;选择3.5.2版本&#xff09; B.编译…

gwt的mvp模式_GWT MVP变得简单

gwt的mvp模式GWT Model-View-Presenter是用于大规模应用程序开发的设计模式。 它源于MVC&#xff0c;它在视图和逻辑之间进行划分&#xff0c;并有助于创建结构良好&#xff0c;易于测试的代码。 为了帮助像我这样的懒惰开发人员&#xff0c;我研究了如何减少使用声明式UI时要编…

简记用ArcGIS处理某项目需求中数据的步骤

文章版权由作者李晓晖和博客园共有&#xff0c;若转载请于明显处标明出处&#xff1a;http://www.cnblogs.com/naaoveGIS/ 1. 背景 项目需求涉及如下几个步骤&#xff1a; a.矢量化 b.获取范围内要素 c.合并要素 d.简化要素 e.获取范围外要素。 2. 矢量化 新建图层 开启编辑&am…

从python学编程pdf_教孩子学编程-Python语言版 PDF 高清完整版 网盘资源分享

提取码&#xff1a;2hrr内容简介 本书属于no starch的经典系列之一&#xff0c;英文版在美国受到读者欢迎。本书全彩印刷&#xff0c;寓教于乐&#xff0c;易于学习&#xff1b;读者可以轻松与快递地掌握解决问题方法和程序设计思维的。“编程从孩子抓起”得到越来越多的…

vertical-align属性详解

vertical-align属性详解:http://www.cnblogs.com/wcp-spring/archive/2013/03/04/2942456.html 关于vertical-align属性&#xff1a;http://www.cnblogs.com/hykun/p/3937852.html 对于vertical-align&#xff1a;middle&#xff1b;的使用&#xff1a;http://www.tuicool.com/…

企业应用程序集成简介

本文是我们名为“ Spring Integration for EAI ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0c;转换器和适…

python实现用户输入用户名和密码不能为空_Python学习【第四篇】用户输入及判断...

用户输入:例1。写一个小程序为用户输入密码。流程如下:1。用户输入其用户名2。输出\u201CHello 用户名\\/usr\/bin\/env python # name raw_input(\u201C你叫什么名字?\u201D)只在pythonname # 输入(\u201C你叫什么名字?\u201D)打印(\u201CHello\u201D名字)例2。当输入一个密…

win7 网络端口怎么设置_教你win7如何设置网络共享文件夹

网络共享是以PC机为载体的信息资源共享。如果我们想让其他人共享我们的文件夹&#xff0c;我们需要进行一些设置。今天&#xff0c;我将分享在win7系统中设置网络共享文件夹的方法现在大多数家庭都使用win7系统&#xff0c;它简化了很多设计&#xff0c;使用起来也很方便。它不…

junit testng_TestNG或JUnit

junit testng多年以来&#xff0c;无论何时使用Java代码进行单元测试&#xff0c;我始终会回到TestNG。 每当我拿起TestNG时&#xff0c;人们都会问我为什么要继续使用TestNG&#xff0c;尤其是默认开发环境&#xff08;例如Eclipse或Maven&#xff09;提供的JUnit时。 继续进行…

背单词

背单词 (word.c/cpp/pas) 【题目描述】 fqk 退役后开始补习文化课啦&#xff0c; 于是他打开了英语必修一开始背单词。 看着满篇的单词非常头疼&#xff0c; 而每次按照相同的顺序背效果并不好&#xff0c;于是 fqk 想了一种背单词的好方法&#xff01;他把单词抄写到一个 n 行…

vue 字符串分割_嗯哼vue组件taginput包教不包会

5分钟实现一个Tag-Input(标签)组件前言本文是wo写组件设计的第一篇文章(处女作)&#xff0c;之所以会写组件设计相关的文章,是因为作为一名优秀的前端工程师&#xff0c;面对各种繁琐而重复的工作&#xff0c;我们不应该按部就班的去辛(dao)勤(gen)劳(huo)动(zhong)&#xff0c…

一元操作符——递增和递减操作符(第一次写博客,紧张.)

一元操作符&#xff0c;即只能操作一个值的操作符&#xff0c;是JS中最简单的操作符。 1.递增和递减操作符 分为2个版本&#xff1a;前置型和后置型。若使用前置递增操作符给一个数值加1&#xff0c;要把&#xff08;&#xff09;放在数值前面&#xff1a; var a 1;a; > va…

Spring 4.2中由注释驱动的事件侦听器

介绍 在应用程序内交换事件已成为许多应用程序中必不可少的部分&#xff0c;幸运的是&#xff0c;Spring为瞬态事件&#xff08;*&#xff09;提供了完整的基础结构。 最近对事务绑定事件的重构为我提供了一个借口&#xff0c;以在实践中检查Spring 4.2中引入的新的注释驱动事件…

mysql插入数据不成功_mysql插入数据失败原因分析

今天在做一个项目时&#xff0c;就是把一个数据库里面的资料导入到另一个数据库里面。想想很简单啊&#xff0c;就是用sql语句&#xff0c;把一个数据库里面数据select读取出来,然后循环update到另一个数据库里面。其实操作起来也很简单的&#xff0c;但是中途出现了问题&#…

SpringBoot项目部署与服务配置

spring Boot 其默认是集成web容器的&#xff0c;启动方式由像普通Java程序一样&#xff0c;main函数入口启动。其内置Tomcat容器或Jetty容器&#xff0c;具体由配置来决定&#xff08;默认Tomcat&#xff09;。当然你也可以将项目打包成war包&#xff0c;放到独立的web容器中&a…