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.封装 所谓封装,就是将客观事物封装成抽象的类,并且类可以把数据和方法让可信的类或者对象进行操作,对不可信的类或者对象进行隐藏。类就是封装数据和操作这些数据代码的逻辑实体。在一个类的内部,某些属性和方法是私有的&#…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...
PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...
