当前位置: 首页 > news >正文

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 } 。

它支持如下表达式(关键字不区分大小写。):

  1. 基本表达式:字面量表达式、关系、逻辑与算术运算表达式、字符串连接及截取表达式、三目运算表达式、正则表达式、括号优先级表达式。
  2. 类相关表达式:类类型表达式、类实例化、instanceof 表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean 引用;
  3. 集合相关表达式:内联 List、内联数组、集合、字典访问、列表、字典、数组修改、集合投影、集合选择;不支持多维内联数组初始化;不支持内联字典定义;
  4. 模板表达式。

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=密码
  1. 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;
    }
    
  2. 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知识点总结&#xff1a;想看的可以从这里进入 目录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反向代理是一种常用的反向代理技术&#xff0c;它允许您将一个或多个Web服务器上的内容公开给Internet上的客户端&#xff0c;而不必暴露您的服务器的IP地址。Nginx反向代理的原理是&#xff1a;客户端发出一个HTTP请求&#xff0c;Nginx服务器收到请求后&#xff0c;将请…...

Happen-Before从入门到踹门

什么是Happen-Before有人翻译为"先行发生原则"&#xff0c;其实也没错&#xff0c;但是更准确的说法应该是&#xff0c;前一个操作的值&#xff0c;后一个总能察觉到。Happen-Before的八条规则程序有序性&#xff1a;在前面的代码优先于在后面的代码执行volatile的变…...

电力系统系统潮流分析【IEEE 57 节点】(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…...

Java——N皇后问题

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

Mybatis一级缓存与二级缓存

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

LQB,手打,PCF8591,ADDA转换,AD1是光敏电阻,AD3是电位器,DA输出

在上述at24c02de 基础上&#xff0c;添加三个函数 一个是读取通道1光敏电阻的数据&#xff1b; 一个是读取通道3的电压&#xff1b; 一个是输出DA的数据。。 5V的AD DA。 如果读入的电压是5V&#xff0c;输入AD&#xff0c;就是255&#xff1b; 如果是0V&#xff0c;就是00000…...

【计组笔记06】计算机组成与原理之控制器和总线结构

这篇文章,主要介绍计算机组成与原理之控制器和总线结构。 目录 一、控制器功能 1.1、控制器组成 1.2、控制单元的输入和输出...

elisp简单实例: auto-save

elisp 能找一个简单又实用的代码很不容易,以下代码不是我的原创,只是结合自己的理解,添加修正了一些注释,荣誉归原作者,感谢原作者的开源精神! 调用说明: 把后面代码存为auto-save.el 在init.el 中写上 (require auto-save) 就可以了. 下面是auto-save.el 内容了. ;; 我…...

写字楼/园区/购物中心空置率太高?快用快鲸智慧楼宇系统

客户租不租你的写字楼&#xff0c;事关区位、交通、环境、价格、面积、装修等诸多因素&#xff0c;但很多招商部对这些影响客户决策的数据并不重视&#xff0c;在客户初次上门看房时仅简单记录姓名、联系方式、需求面积&#xff0c;对其他核心数据熟视无睹&#xff0c;也为日后…...

【JavaSE】数组的定义和使用(上)

数组的定义和使用&#xff08;上&#xff09;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&#xff0c;一个真正的计算机高手。 适合有成为IT领域技术大牛的人参考。 写给大一新生和所有向深耕IT领域的人&#xff0c;避免走一些弯路。 第一门入门的必备功课-语法与算法 什么是计算机&#xff1f; 用来做运算的机器 电子计算机在运算方面…...

TD算法超详细解释,一篇文章看透彻!

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

4.1 路由器(华硕 官改/梅林 华为 小米 路由) 使用花生壳 实现远程管理

最近添置了一台华硕的八爪鱼GT AC5300&#xff0c;到手后刷了官改&#xff0c;而里面软件中就提供了花生壳程序&#xff0c;想到花生壳为每个用户提供了两条免费映射&#xff08;带宽为1mbs&#xff0c;流量为1g/月&#xff09;&#xff0c;所以就打算利用来做一个远程访问。具…...

内容算法解读:提高内容摘要与原文的一致性(Faithfulness)

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

python用openpyxl包操作xlsx文件,统计表中合作电影数目最多的两个演员

题目&#x1f389;&#x1f389;&#x1f389;&#xff1a;编程完成下面任务&#xff1a;已知excel文件“电影导演演员信息表.xlsx”如下图所示&#xff1a;&#x1f373;&#x1f373;&#x1f373;要求&#xff1a;使用 openpyxl 包操作打开此文件&#xff0c;编写程序统计在…...

Lesson12---人工神经网络(1)

12.1 神经元与感知机 12.1.1 感知机 感知机&#xff1a; 1957&#xff0c; Fank Rosenblatt 由两层神经元组成&#xff0c;可以简化为右边这种&#xff0c;输入通常不参与计算&#xff0c;不计入神经网络的层数&#xff0c;因此感知机是一个单层神经网络 感知机 训练法则&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读书笔记|《长安的荔枝》——只要肯努力&#xff0c;办法总比困难多 《长安的荔枝》这本书真是酣畅淋漓啊&#xff0c;读起来一气呵成&#xff0c;以讲故事的口吻叙述&#xff0c;上林署九品小官员——李善德&#xff0c;兢兢业业工作多年&#xff0c;终于借贷买了房&…...

java封装继承多态详解

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

【uni-app教程】UniAPP 常用组件和 常用 API 简介# 知心姐姐聊天案例

五、UniAPP 常用组件简介 uni-app 为开发者提供了一系列基础组件&#xff0c;类似 HTML 里的基础标签元素&#xff0c;但 uni-app 的组件与 HTML 不同&#xff0c;而是与小程序相同&#xff0c;更适合手机端使用。 虽然不推荐使用 HTML 标签&#xff0c;但实际上如果开发者写了…...

阿尔法开发板 .bin 文件烧写

一. IMX6ULL 开发板简介 IMX6ULL 开发板是正点原子提供的阿尔法开发板&#xff0c;所用芯片为恩智浦&#xff0c;基于 Cortex-A7 架构。 这里介绍一下裸机篇中&#xff0c;关于如何将 .bin 文件烧写进 SD 卡&#xff0c;从而设备运行程序。 二. xx.bin 文件烧写 IMX6ULL支…...

Ceres-Solver 安装与卸载ubuntu20.04

卸载 sudo rm -rf /usr/local/lib/cmake/Ceres /usr/local/include/ceres /usr/local/lib/libceres.a 安装 sudo apt-get install libatlas-base-dev libsuitesparse-dev git clone https://github.com/ceres-solver/ceres-solver cd ceres-solver git checkout $(git descr…...

汇编系列02-借助操作系统输出Hello World

说明:本节的程序使用的是x86_64指令集的。 汇编语言是可以编译成机器指令的&#xff0c;机器指令是可以直接在CPU上面执行的。我们编写的汇编程序既可以直接在操作系统的帮助下执行&#xff0c;也可以绕过操作系统&#xff0c;直接在硬件上执行。 如果你打算编写的汇编程序在…...

【2023unity游戏制作-mango的冒险】-前六章API,细节,BUG总结小结

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity游戏制作 ⭐mango的冒险前六章总结⭐ 文章目录⭐mango的冒险前六章总结⭐&#x1f468;‍&a…...

进程控制及其操作

进程创建1.1 fork()函数1.2 fork()函数的返回值进程等待2.1 进程等待的必要性1.之前讲过&#xff0c;子进程退出&#xff0c;父进程如果不管不顾&#xff0c;就可能造成‘僵尸进程’的问题&#xff0c;进而造成内存泄漏。 2.另外&#xff0c;进程一旦变成僵尸状态&#xff0c;那…...

Git常用命令复习笔记

1. Git与SVN区别&#xff0c;各自优缺点 Git&#xff1a; 分布式&#xff0c;每个参与开发的人的电脑上都有一个完整的仓库&#xff0c;不担心硬盘出问题&#xff1b;在不联网的情况下&#xff0c;照样可以提交到本地仓库&#xff0c;可以查看以往的所有log&#xff0c;等到有…...

代码随想录算法训练营day49 | 动态规划 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

day49123.买卖股票的最佳时机III1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组188.买卖股票的最佳时机IV1.确定dp数组以及下标的含义2.确定递推公式4.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组123.买卖股票的最佳时机III …...

【教学典型案例】14.课程推送页面整理-增加定时功能

目录一&#xff1a;背景介绍1、代码可读性差&#xff0c;结构混乱2、逻辑边界不清晰&#xff0c;封装意识缺乏![在这里插入图片描述](https://img-blog.csdnimg.cn/bbfc5f04902541db993944ced6b62793.png)3、展示效果不美观二&#xff1a;案例问题分析以及解决过程1、代码可读性…...

【算法基础】DFS BFS 进阶训练

DFS与BFS的基础篇详见:https://blog.csdn.net/m0_51339444/article/details/129301451?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22129301451%22%2C%22source%22%3A%22m0_51339444%22%7D 一、案例分析1 (树的重心 —— D…...