Spring SpEL表达式
Java知识点总结:想看的可以从这里进入
目录
- 17、Spring SpEL
- 17.1、简介
- 17.2、配合@value使用
- 17.2.1、基本字面值
- 17.2.2、类相关表达式
- 17.2.3、properties
- 17.2.4、T运算符
- 17.2.5、new
- 17.2.6、Elvis运算符
- 17.2.7、运算符
- 17.2、配合XML使用
17、Spring SpEL
17.1、简介
Spring3中引入了Spring表达式语言—Spring SpEL,SpEL表达式是一种强大,简洁的装配Bean的方式,支持在xml和注解中使用,类似于JSP的EL,JSTL表达式语言。他可以通过运行期间执行的表达式将值装配到我们的属性或构造函数当中,,更可以调用JDK中提供的静态常量,获取外部Properties文件中的的配置。
其实无论是XML还是注解,在注入Bean或是属性时都是静态的注入,那么如果Bean A中的一个成员变量的值需要参考Bean B中的成员变量的值,那么这种静态的注入就有点力不从心了。所以Spring 提供了SpEL表示式来实现动态的注入。
Spring SpEL的格式为:#{ SpEL expression } 。
它支持如下表达式(关键字不区分大小写。):
- 基本表达式:字面量表达式、关系、逻辑与算术运算表达式、字符串连接及截取表达式、三目运算表达式、正则表达式、括号优先级表达式。
- 类相关表达式:类类型表达式、类实例化、instanceof 表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean 引用;
- 集合相关表达式:内联 List、内联数组、集合、字典访问、列表、字典、数组修改、集合投影、集合选择;不支持多维内联数组初始化;不支持内联字典定义;
- 模板表达式。
17.2、配合@value使用
17.2.1、基本字面值
支持各种类型的字面值。字符串或字符类型的字面值需要使用引号包括,其他类型字面值直接写。
@Component
public class Student {//注入int@Value("#{1}")private int id;//注入String@Value("#{'张三'}")private String name;//注入算数表达式@Value("#{30-12}")private int age;//注入布尔值@Value("#{true}")private boolean deleted;}
17.2.2、类相关表达式
除字面量外,还可以直接调用IOC容器中已经存在的Bean对象,且可以直接调用对象的属性。也可以直接对集合进行赋值
<bean id="dog" class="com.yu.springtest.entity.Dog"><property name="name" value="大黄"/>
</bean><util:list id="list"><value>java</value><value>python</value><value>c++</value>
</util:list>
//注入一个对象
@Value("#{dog}")
private Dog dog;//可以调用对象
@Value("#{dog.name}")
private String dogName;//注入集合
@Value("#{list}")
private List<String> strings;@Value("#{{1,2,3,4}}")
List<Integer> list;@Value("#{{'java','python'}")
List<String> strings;@Value("#{{1,2,3,4}")
int[] ints;@Value("#{{name:'张三',age:'13'}")
Map<String, String> map;//从集合中获取数据
@Value("#{test.ints[0]}")
int id;@Value("#{test.map['name']}")
private String name1;
17.2.3、properties
SpEl还能取出 properties文件中的数据,注入到bean变量
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssmtest?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
jdbc.username=root
jdbc.password=密码
-
util:properties加载的properties数据
<util:properties id="database" location="classpath:database.properties"/>
@Component public class Database {@Value("#{database['jdbc.driver']}")private String driver;@Value("#{database['jdbc.url']}")private String url;@Value("#{database['jdbc.username']}")private String name;@Value("#{database['jdbc.password']}")private String password; }
-
context:property-placeholder加载的properties数据
<context:property-placeholder location="classpath:database.properties"/>
@Component public class Database {@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String name;@Value("${jdbc.password}")private String password; }
17.2.4、T运算符
T操作符可以获取表达式对象的类型, 可以调用表达式对象的静态方法,如果是java.lang包下的类的对象,可以省略包名。
public class Test {public static String getUserName(){return "张三";}@Value("#{T(com.yu.springtest.spel.Test).getUserName()}")private String name;@Value("#{T(com.yu.springtest.spel.Test).userName}")private String userName;}
17.2.5、new
在 SpEl 中可以直接使用new 关键字来创建对象,如果new的是java.lang包下的类的对象,可以省略包名。
@Value("#{new com.yu.springtest.entity.Dog('大黄')}")
private Dog dog;
17.2.6、Elvis运算符
Spring EL表达式支持Elvis运算符,语法是变量?:默认值
意思是当某变量不为 null 的时候使用该变量,当该变量为 null 的时候使用指定的默认值。
//如果student.name不为空则使用student.name,否则使用张三
@Value("#{student.name?:'张三'}")
String username;
17.2.7、运算符
表达式中支持各种运算符,运算规则和Java规则类似。操作符:
- 关系操作符, 包括: eq(==), ne(!=), lt()<, le(<=), gt(>), ge(>=)
- 逻辑运算符, 包括: and(&&), or(||), not(!)
- 数学操作符, 包括: 加(+), 减(-), 乘(*), 除(/), 取模(%), 幂指数(^)
- 其他操作符, 如: 三元操作符(可用于赋默认值,), instanceof、 赋值(=), 正则匹配
17.2、配合XML使用
和在注解中使用类似、
<bean id="dog" class="com.yu.springtest.entity.Dog"><property name="name" value="大黄"/>
</bean><util:list id="list"><value>java</value><value>python</value><value>c++</value>
</util:list><bean id="student" class="com.yu.springtest.entity.Student"><property name="dog" value="#{dog}"/><property name="dogName" value="#{dog.name}"/><property name="strings" value="#{list}"/><property name="name" value="#{list[0]}"/>
</bean>
相关文章:
Spring SpEL表达式
Java知识点总结:想看的可以从这里进入 目录17、Spring SpEL17.1、简介17.2、配合value使用17.2.1、基本字面值17.2.2、类相关表达式17.2.3、properties17.2.4、T运算符17.2.5、new17.2.6、Elvis运算符17.2.7、运算符17.2、配合XML使用17、Spring SpEL 17.1、简介 S…...
Nginx反向代理原理详解与配置
Nginx反向代理是一种常用的反向代理技术,它允许您将一个或多个Web服务器上的内容公开给Internet上的客户端,而不必暴露您的服务器的IP地址。Nginx反向代理的原理是:客户端发出一个HTTP请求,Nginx服务器收到请求后,将请…...
Happen-Before从入门到踹门
什么是Happen-Before有人翻译为"先行发生原则",其实也没错,但是更准确的说法应该是,前一个操作的值,后一个总能察觉到。Happen-Before的八条规则程序有序性:在前面的代码优先于在后面的代码执行volatile的变…...

电力系统系统潮流分析【IEEE 57 节点】(Matlab代码实现)
👨🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…...

Java——N皇后问题
题目链接 leetcode在线oj题——N皇后 题目描述 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ÿ…...

Mybatis一级缓存与二级缓存
一、MyBatis 缓存缓存就是内存中的数据,常常来自对数据库查询结果的保存。使用缓存,我们可以避免频繁与数据库进行交互,从而提高响应速度。MyBatis 也提供了对缓存的支持,分为一级缓存和二级缓存,来看下下面这张图&…...

LQB,手打,PCF8591,ADDA转换,AD1是光敏电阻,AD3是电位器,DA输出
在上述at24c02de 基础上,添加三个函数 一个是读取通道1光敏电阻的数据; 一个是读取通道3的电压; 一个是输出DA的数据。。 5V的AD DA。 如果读入的电压是5V,输入AD,就是255; 如果是0V,就是00000…...
【计组笔记06】计算机组成与原理之控制器和总线结构
这篇文章,主要介绍计算机组成与原理之控制器和总线结构。 目录 一、控制器功能 1.1、控制器组成 1.2、控制单元的输入和输出...
elisp简单实例: auto-save
elisp 能找一个简单又实用的代码很不容易,以下代码不是我的原创,只是结合自己的理解,添加修正了一些注释,荣誉归原作者,感谢原作者的开源精神! 调用说明: 把后面代码存为auto-save.el 在init.el 中写上 (require auto-save) 就可以了. 下面是auto-save.el 内容了. ;; 我…...

写字楼/园区/购物中心空置率太高?快用快鲸智慧楼宇系统
客户租不租你的写字楼,事关区位、交通、环境、价格、面积、装修等诸多因素,但很多招商部对这些影响客户决策的数据并不重视,在客户初次上门看房时仅简单记录姓名、联系方式、需求面积,对其他核心数据熟视无睹,也为日后…...

【JavaSE】数组的定义和使用(上)
数组的定义和使用(上)6-数组的定义与使用1. 数组的基本概念1.1 为什么要使用数组1.2 什么是数组1.3 数组的创建及初始化1.3.1 数组的创建1.3.2 数组的初始化1.4 数组的使用1.4.1 数组中元素的访问1.4.2 遍历数组2. 数组是引用类型2.1 初始JVM的内存分布2…...

计算机的学习路线
本文是介绍如何成为一个Geek,一个真正的计算机高手。 适合有成为IT领域技术大牛的人参考。 写给大一新生和所有向深耕IT领域的人,避免走一些弯路。 第一门入门的必备功课-语法与算法 什么是计算机? 用来做运算的机器 电子计算机在运算方面…...

TD算法超详细解释,一篇文章看透彻!
【已解决】TD算法超详细解释和实现(Sarsa,n-step Sarsa,Q-learning)一篇文章看透彻! 郑重声明:本系列内容来源 赵世钰(Shiyu Zhao)教授的强化学习数学原理系列,本推文出于非商业目的分享个人学习…...

4.1 路由器(华硕 官改/梅林 华为 小米 路由) 使用花生壳 实现远程管理
最近添置了一台华硕的八爪鱼GT AC5300,到手后刷了官改,而里面软件中就提供了花生壳程序,想到花生壳为每个用户提供了两条免费映射(带宽为1mbs,流量为1g/月),所以就打算利用来做一个远程访问。具…...

内容算法解读:提高内容摘要与原文的一致性(Faithfulness)
全文摘要:受益于预训练语言模型的发展,应用神经网络模型提取内容摘要的技术也获得了长足进步。但目前还存在一个未被很好解决的问题:神经网络模型提取的摘要不能如实反映原文档的中心思想,没有做到忠实(not faithful&a…...

python用openpyxl包操作xlsx文件,统计表中合作电影数目最多的两个演员
题目🎉🎉🎉:编程完成下面任务:已知excel文件“电影导演演员信息表.xlsx”如下图所示:🍳🍳🍳要求:使用 openpyxl 包操作打开此文件,编写程序统计在…...

Lesson12---人工神经网络(1)
12.1 神经元与感知机 12.1.1 感知机 感知机: 1957, Fank Rosenblatt 由两层神经元组成,可以简化为右边这种,输入通常不参与计算,不计入神经网络的层数,因此感知机是一个单层神经网络 感知机 训练法则&am…...
算法练习-排序(二)
算法练习-排序(二) 文章目录算法练习-排序(二)1 合并排序的数组1.1 题目1.2 题解2 有效的字母异位词2.1 题目2.2 题解3 判断能否形成等差数列3.1 题目3.2 题解4 合并区间4.1 题目3.2 题解5 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面5.1 题目5.2 题解6 颜色分类6.1 题目6.…...

202302读书笔记|《长安的荔枝》——只要肯努力,办法总比困难多
202302读书笔记|《长安的荔枝》——只要肯努力,办法总比困难多 《长安的荔枝》这本书真是酣畅淋漓啊,读起来一气呵成,以讲故事的口吻叙述,上林署九品小官员——李善德,兢兢业业工作多年,终于借贷买了房&…...

java封装继承多态详解
1.封装 所谓封装,就是将客观事物封装成抽象的类,并且类可以把数据和方法让可信的类或者对象进行操作,对不可信的类或者对象进行隐藏。类就是封装数据和操作这些数据代码的逻辑实体。在一个类的内部,某些属性和方法是私有的&#…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...