前言

github: https://github.com/vergilyn/SpringBootDemo

代码位置:(注意测试方法在,test下的SpelValueApplicationTest.class)

一、什么是SpEL

SpEL:spring表达式语言,Spring Expression Language。从spring3开始引入。

可以通过xml或注解的施行映射properties中的属性到JavaBean,并通过Spring注入。

二、Spring boot中常见的应用

@Value("${base.name}")
private String baseName; @Value("#{'string'}") // 或 @Value('#{"string"}')
public String spelString;

(个人理解) 以$开头的只是普通模式,而以#开头的才是SpEL。

针对这两种,它们默认值的写法也是不一样的。

${ property : default_value }
#{ obj.property ?: default_value }

三、以$取值

## value-base.propertiesbase.name=vergil
base.song=Safe&Sound
base.nest.song=base.song
package com.vergilyn.demo.spring.value.property;

import java.util.Calendar;
import java.util.Date; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component; @PropertySource("classpath:config/value/value-base.properties")
@Component("base")
public class BaseProperty {
@Value("${base.name}")
private String baseName;
@Value("${base.song}")
private String baseSong;
/* 嵌套(内往外)
* 解析:先取内部${base.nest.song}=base.song -> ${base.song} = Safe&Sound
*/
@Value(value = "${${base.nest.song}}")
private String nestSong; @Override
public String toString() {
return this.getClass().getSimpleName() +":{baseName: "+this.baseName+", baseSong: "+this.baseSong+"}";
} public String getBaseName() {
return baseName;
}
public void setBaseName(String baseName) {
this.baseName = baseName;
}
public String getBaseSong() {
return baseSong;
}
public void setBaseSong(String baseSong) {
this.baseSong = baseSong;
} public String getNestSong() {
return nestSong;
} public void setNestSong(String nestSong) {
this.nestSong = nestSong;
} public Date nowDate(){
return Calendar.getInstance().getTime();
}
}

结果:

BaseProperty: {"baseName":"vergil","baseSong":"Safe&Sound","nestSong":"Safe&Sound"}

四、以#取值 一般形式

## value-spel.propertiesspel.name=dante
spel.mix=baseSong
package com.vergilyn.demo.spring.value.property;

import java.util.Date;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component; @PropertySource("classpath:config/value/value-spel.properties")
@Component
public class SpelProperty { @Value("${spel.name}") //注意这里是 $
private String spelName;
/* base:指BaseProperty.class(默认为baseProperty),因为定义了@Component("base")
* baseSong:并不是*.properties中的key,而是此key对应的class变量
*/
@Value("#{base.baseSong}")
private String spelSong;
/* // @Value("${ '#{base.baseSong}' }") //这个不支持。因为#开头的才是spel。
* 解析:由内往外,${spel.mix} = baseSong。然后在spel表达式中,('')表示定义字符串。
* 所以 #{'baseSong'} = baseSong
*/
@Value("#{ '${spel.mix}' }")
private String mixSong;
@Value("#{base. ${spel.mix} }") //组合,特别.后面跟的是对象属性。所以要是class中的属性,而不是properties中的key
private String mixSong2; public String getMixSong2() {
return mixSong2;
}
public void setMixSong2(String mixSong2) {
this.mixSong2 = mixSong2;
}
public String getSpelName() {
return spelName;
}
public void setSpelName(String spelName) {
this.spelName = spelName;
}
public String getSpelSong() {
return spelSong;
}
public void setSpelSong(String spelSong) {
this.spelSong = spelSong;
} public String getMixSong() {
return mixSong;
}
public void setMixSong(String mixSong) {
this.mixSong = mixSong;
}
}

结果:

SpelProperty: {"mixSong":"baseSong","mixSong2":"Safe&Sound","spelName":"dante","spelSong":"Safe&Sound"}

四、以#取值 各种复杂形式

package com.vergilyn.demo.spring.value.property;

import java.util.Date;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; @Component
public class SpelBasisProperty { @Value("#{124}")
public int spelInt;
@Value("#{124.24}")
public float spelFloat;
@Value("#{1e4}")
public double spelSpec;
@Value("#{true}")
public boolean spelBoolean = false;
@Value("#{'string'}") // 或 @Value('#{"string"}')
public String spelString;
/* 调用方法。
* 在SpEL中避免抛出空指针异常(NullPointException)的方法是使用null-safe存取器:
* ?. 运算符代替点(.) #{object?.method()},如果object=null,则不会调用method()
*/
@Value("#{base.getNestSong()}")
public String spelNestSong;
@Value("#{base.nowDate()}") //返回值可以是任何类型
public Date spelNowDate;
@Value("#{null?.toString()}") //当?.左边为null时,不再执行右边的方法。(避免NPE)
public String spelNull; /**
* 在SpEL中,使用T()运算符会调用类作用域的方法和常量。
*/
@Value("#{T(java.lang.Math).PI}")
public double T_PI;
@Value("#{T(java.lang.Math).random()}")
public double T_andom; /**
* SpEL运算>>>>
* 四则运算:+ - * /
* 比较:eq(==),lt(<),le(<=),gt(>),ge(>=)。
* 逻辑表达式:and,or,not或!。
* 三元表达式:
* i. #{base.name == 'vergilyn' ? true : false}
* ii. #{base.name == 'vergilyn' ? base.name : 'dante'}
* spel可以简化为:#{base.name ?: 'dante'} 当base.name !=null则取base.name,否则取'dante'。
* (?:)通常被称为elvis运算符。
* 正则:#{base.song matches '[a-zA-Z0-9._%+_]+@[a-zA-Z0-9.-]+\\.com'} 。 (不光有matches,还有很多别的,可详细baidu/google)
*/
@Value("#{100 / 20}") //四则运算: + - * /
public int spelArithmetic;
}

结果:

SpelBasisProperty: {"T_PI":3.141592653589793,"T_andom":0.49286684542729553,"spelArithmetic":5,"spelBoolean":true,"spelFloat":124.24,"spelInt":124,"spelNestSong":"Safe&Sound","spelNowDate":1489169611736,"spelSpec":10000.0,"spelString":"string"}

【spring boot】SpringBoot初学(2.2)– SpEL表达式读取properties属性到Java对象的更多相关文章

  1. Spring Boot]SpringBoot四大神器之Actuator

    论文转载自博客: https://blog.csdn.net/Dreamhai/article/details/81077903 https://bigjar.github.io/2018/08/19 ...

  2. spring Boot启动报错Initialization of bean failed; nested exception is java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotatedElementUtils.getAnnotationAttributes

    spring boot 启动报错如下 org.springframework.context.ApplicationContextException: Unable to start web serv ...

  3. (五)Spring Boot之@RestController注解和ConfigurationProperties配置多个属性

    一.@RestController和@Controller的区别 @RestController注解相当于@ResponseBody + @Controller合在一起的作用. 如果只是使用@Rest ...

  4. [Spring Boot] Set Context path for application in application.properties

    If you were using Microservice with Spring Boot to build different REST API endpoints, context path ...

  5. 曹工说Spring Boot源码(5)-- 怎么从properties文件读取bean

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  6. 【spring boot】映射properties文件属性--到Java对象

    描述 将*.properties中的内容映射到java对象中: 主要步骤 添加 @Component 注解: 使用 @PropertySource 注解指定配置文件位置: 使用 @Configurat ...

  7. spring利用注解方式实现Java读取properties属性值

    1. 建立properties文件:我在resource下面建立一个config文件夹,config文件夹里面有mytest.properties文件,文件内容如下: sam.username=sam ...

  8. Spring Boot系列教程四:配置文件详解properties

    一.配置随机数,使用随机数 在application.properties文件添加配置信息 #32位随机数 woniu.secret=${random.value} #随机整数 woniu.numbe ...

  9. 解决 spring boot 线程中使用@Autowired注入Bean的方法,报java.lang.NullPointerException异常

    问题描述 在开发中,因某些业务逻辑执行时间太长,我们常使用线程来实现.常规服务实现类中,使用 @Autowired 来注入Bean,来调用其中的方法.但如果在线程类中使用@Autowired注入的Be ...

随机推荐

  1. CCF_201503-2_数字排序

    自己写个排序的cmp. #include<iostream> #include<cstdio> #include<algorithm> using namespac ...

  2. 转载 angularJS filter 过滤器

    angularjs中的filter(过滤器) 标签: angularjsfilter   源文地址:http://www.ncloud.hk/技术分享/angularjs中的filter-过滤器/ f ...

  3. angular 控件间的通信

    先引入 设置meta元素 http://blog.sina.com.cn/s/blog_51048da70101cgea.html //设置 虚拟窗口的大小等于设备的大小 <meta name= ...

  4. mybaits分页插件的使用

    1.导入依赖坐标 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>p ...

  5. 1276:【例9.20】P2758 编辑距离

    题目传送门[(https://www.luogu.com.cn/problem/P2758)] 题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作 ...

  6. lwip stats

    lwip统计量分两种,一种是lwip自己的,一种是snmp的. 直接用snmp的 /* ----------------------------------- ---------- Statistic ...

  7. logstash 安装插件multiline

    一.安装multiline 在使用elk 传输记录 java 日志时,如下 一个java的报错 在elk中会按每一行 产生多条记录,不方便查阅 这里修改配置文件 使用  multiline   插件 ...

  8. 设置ssh远程其他主机登录显示提示信息

    文件及路径: /etc/motd 实例: [root@A-client ~]# ssh -p 22 test@10.0.0.2 test@10.0.0.2's password: Last login ...

  9. windows下修改tomcat的startup.bat脚本文件后台运行

    1.修改startup.bat文件 rem Get remaining unshifted command line arguments and save them in the set CMD_LI ...

  10. xmppmini 项目详解:一步一步从原理跟我学实用 xmpp 技术开发 2.登录的实现

    第二章登录的实现 金庸<倚天屠龙记> 张三丰缓缓摇头,说道:“少林派累积千年,方得达成这等绝技,决非一蹴而至,就算是绝顶聪明之人,也无法自创.”他顿了一顿,又道:“我当年在少林寺中住过,只 ...