spring 占位符默认值_Spring中的值注释中的占位符支持

spring 占位符默认值

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

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

注册

在没有no-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

spring 占位符默认值

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

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

相关文章

java用户名检查数据库_登入界面账号密码是访问数据库,但登入问题时if判断时就是执行不了...

回复 2楼 林月儿我按着你的方法试了下&#xff0c;可还是这个判断不能执行 if(password.equals(drmm.getText())){view.setText("登入成功");完整代码如下&#xff1a;import java.awt.*;import java.awt.event.*;import *;import *;import java.…

五皇后问题 java_Java的5个古怪问题

五皇后问题 java我们有机会接触到一些最奇怪的Java难题 即使是最有经验的Java开发人员&#xff0c;也会在这篇文章中发现令人困惑的问题。 或者至少是有趣的&#xff08;绝对不公平&#xff09;。 在经历了Java Deathmatch冒险之后&#xff0c;我们决定这次发布一系列不同的问…

java加密成固定长度_Java使用MD5加密,生成的密文长度只有31位

在使用MD5加密时&#xff0c;生成的密文长度只有31位&#xff0c;该怎么解决&#xff1f;代码如下&#xff1a;public static String toMd5(String str) {String re null;byte encrypt[];try {byte[] tem str.getBytes();MessageDigest md5 MessageDigest.getInstance("…

可以自定义模板的ide_将IDE检查应用于自定义Java批注

可以自定义模板的ideJ2SE 5中注释的引入改变了我们编写和处理Java的方式。 除了Java SE的预定义注释外 &#xff0c;框架&#xff0c;IDE和工具包还引入了自己的自定义注释 。 Checker框架提供了一些示例&#xff0c;说明如何使用自定义批注在Java中增加类型安全性 。 在本文中…

java设置弹出框为模态_点击按钮弹出模态框的一系列操作代码实例

实现功能提交按钮功能&#xff1a;点击提交按钮的时候都会弹出模态框&#xff0c;但是有不同的状态&#xff1a;审核状态未通过&#xff1a;弹出未通过理由的input输入框&#xff0c;模态框中除了取消和确定按钮&#xff0c;新增确定并保存医院的按钮审核状态已通过&#xff1a…

spock框架_Spock VW:编写自定义的Spock框架扩展

spock框架Spock框架具有多个内置扩展 &#xff0c;这些扩展支持许多核心功能&#xff0c;例如Ignore和Timeout批注。 但更重要的是&#xff0c;鼓励开发人员编写自己的扩展。 例如&#xff0c; SpringExtension很好地将Spock与Spring框架集成在一起。 编写自定义扩展没有很好的…

java log 断点_项目中常见的log日志调用

第一种用法&#xff1a;引用org.apache.commons.logging.Log。import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;private static final Log logger LogFactory.getLog(PolicyAppBizAction.class); //PolicyAppBizAction.class是自己定义…

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

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

java中bpmn流程图_Java学习之BPMN知识以及Activiti的流程部署

BPMN的介绍Activiti项目是一项新的基于Apache许可的开源BPM平台&#xff0c;从基础开始构建&#xff0c;旨在提供支持新的BPMN 2.0标准&#xff0c;包括支持对象管理组(OMG)&#xff0c;面对新技术的机遇&#xff0c;诸如互操作性和云架构&#xff0c;提供技术实现。那什么是BP…

javaone_JavaOne 2015 –第二十版十大收获

javaone我们刚刚在旧金山有了JavaOne的第二十版。 这将是我自2004年以来第十二次参加不间断的系列活动。最大的教训是什么&#xff0c;可以揭示Java的未来。 模块化斗争 自从Java 2007首次提到模块以来&#xff0c;已经花费了将近9年的时间&#xff0c;或者说&#xff0c;直到…

java批量处理数据库语句_Java项目中调用bat批处理进行多用户数据库备份

Java项目中调用bat批处理配合使用BCP进行多用户数据的备份一、项目需求最近项目中需要对数据库(Sql Server系列数据库)进行备份。项目中的需求不是简单的整个数据库的备份&#xff0c;而是根据用户来备份&#xff0c;具体的备份策略如下&#xff1a;①系统为某一赛事管理类型的…

mycat和应用程序集成_企业应用程序集成简介

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

java中读取单个字符_如何使用Java中的Scanner类读取单个字符?

从Java 1.5开始引入Scanner类。此类接受File&#xff0c;InputStream&#xff0c;Path和String对象&#xff0c;使用正则表达式逐个令牌读取所有原始数据类型和String(从给定的源)令牌。默认情况下&#xff0c;空格被视为定界符(将数据分成令牌)。使用Scanner类读取字符Scanner…

java中的case1怎么说_Java Cas20ServiceTicketValidator類代碼示例

本文整理匯總了Java中org.jasig.cas.client.validation.Cas20ServiceTicketValidator類的典型用法代碼示例。如果您正苦於以下問題&#xff1a;Java Cas20ServiceTicketValidator類的具體用法&#xff1f;Java Cas20ServiceTicketValidator怎麽用&#xff1f;Java Cas20Service…

drill apache_使用Apache Drill深入研究当今的大数据

drill apache自2014年9月首次提供Beta版以来&#xff0c; Apache Drill一直在获得广泛的用户采用和社区动力。2015年5月发布了Drill的通用版本-Drill 1.0&#xff0c;此后大量客户在生产中部署和使用了Drill。 在这篇博客文章中&#xff0c;我将简要总结客户在Drill中发现非常宝…

akka 消息发送接收_Akka型演员:探索接收器模式

akka 消息发送接收在上一篇文章中&#xff0c;我们研究了Akka Typed提供的一些基本功能。 在本文和下一篇文章中&#xff0c;我们将更进一步地了解一些其他功能&#xff0c;并通过查看Akka Typed提供的两种不同模式来做到这一点&#xff1a;Receiver和Receptionist模式。 如果您…

scale和java比较_浅谈java中BigDecimal的equals与compareTo的区别

这两天在处理支付金额校验的时候出现了点问题&#xff0c;有个金额比较我用了BigDecimal的equals方法来比较两个金额是否相等&#xff0c;结果导致金额比较出现错误(比如3.0与3.00的比较等)。【注&#xff1a;以下所讲都是以sun jdk 1.4.2版本为例&#xff0c;其他版本实现未必…

activemq和jms_带有ActiveMQ和Maven的JMS Sender应用程序

activemq和jms我们已经看到了如何使用ActiveMQ和Maven创建JMS Receiver应用程序 。 让我们看看我们如何类似地创建JMS Sender应用程序 。 web.xml与创建接收器应用程序时使用的相同&#xff1a; <web-app xmlns"http://java.sun.com/xml/ns/javaee"xmlns:xsi&qu…

java初始化hashset_JAVA中的Hashset类

HashSet扩展AbstractSet并且实现Set接口。它创建一个类集&#xff0c;该类集使用散列表进行存储。正像大多数读者很可能知道的那样&#xff0c;散列表通过使用称之为散列法的机制来存储信息。在散列(hashing)中&#xff0c;一个关键字的信息内容被用来确定唯一的一个值&#xf…

java集成lucene_将Lucene搜索集成到应用程序中

java集成lucene本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中&#xff0c;您将了解Lucene。 您将了解为什么这样的库很重要&#xff0c;然后了解Lucene中搜索的工作方式。 此外&#xff0c;您将学习如何将Lucene Search集成到您自己的应用程序中…