Spring神器:SpEl表达式

SpEl使用

Spring Expression Language (SpEL) 是Spring框架提供的一种强大的表达式语言,它允许开发人员在运行时动态地计算表达式,并访问和操作对象图。SpEL是一种基于表达式的语言,它支持各种操作符、函数和变量,可以用来执行各种复杂的计算和数据操作。

SpEL的语法类似于Java表达式语言,但它更加强大和灵活。SpEL表达式可以用在Spring配置文件中,也可以用在代码中。在Spring配置文件中,SpEL表达式可以用来设置Bean的属性值,或者用来执行一些条件判断和循环操作。在代码中,SpEL表达式可以用来动态地计算表达式,并访问和操作对象图。

SpEL表达式的基本语法如下:

#{expression}

其中,expression是要计算的表达式。SpEL表达式可以包含各种操作符、函数和变量,例如:

  • 算术运算符:+、-、*、/、%
  • 比较运算符:==、!=、>、<、>=、<=
  • 逻辑运算符:&&、||、!
  • 字符串运算符:+、concat()
  • 三元运算符:(condition)? true-expression : false-expression
  • 变量引用:@beanName、#root、this、#global
  • 方法调用:object.method()、object.method(param)
  • 数组和列表访问:array[index]、list[index]
  • Map访问:map[key]

配置文件中使用

SpEL表达式可以用在Spring配置文件中,例如:

<bean id="myBean" class="com.example.MyBean"><property name="name" value="#{systemProperties['user.name']}" /><property name="age" value="#{T(java.lang.Math).random() * 100}" />
</bean>

在这个例子中,我们使用SpEL表达式设置了MyBean的name属性和age属性。对于name属性,我们使用了systemProperties变量引用,它引用了系统属性user.name的值。对于age属性,我们使用了T()函数引用了Math类,并调用了random()方法,然后将其乘以100,得到一个随机数。

代码中使用

SpEL表达式也可以用在代码中,例如:

ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression("T(java.lang.Math).random() * 100");
double value = expression.getValue(Double.class);

在这个例子中,我们使用SpelExpressionParser解析了一个SpEL表达式,然后调用了getValue()方法计算了表达式的值,并将其转换为Double类型。

SpEL表达式还支持各种高级特性,例如:

  • 集合投影:从集合中选择满足条件的元素,例如:#{myList.?[size() > 10]}
  • 列表切片:从列表中选择一部分元素,例如:#{myList[1:5]}
  • 正则表达式匹配:使用正则表达式匹配字符串,例如:#{‘abc123’.matches(‘^\w+\d+$’)}
  • 方法引用:引用方法,例如:#{T(com.example.MyClass).myMethod()}
  • 内联列表:创建内联列表,例如:#{[1, 2, 3]}
  • 内联映射:创建内联映射,例如:#{{key1: ‘value1’, key2: ‘value2’}}

注解中使用

SpEL表达式也可以用在注解上,以实现更灵活的依赖注入和配置。在Spring中,可以使用@Value注解在注解中使用SpEL表达式。

以下是一个使用@Value注解在注解中使用SpEL表达式的示例:

@Component
public class MyComponent {@Value("#{systemProperties['user.home']}")private String userHome;@Value("#{T(java.lang.Math).random() * 100}")private double randomNumber;// getters and setters
}

在这个示例中,我们在MyComponent类中使用@Value注解在userHome属性中注入了系统属性user.home的值,在randomNumber属性中注入了一个随机数。这两个属性都使用了SpEL表达式来计算其值。

需要注意的是,在@Value注解中使用SpEL表达式时,必须将表达式放在#{和}之间,以告诉Spring这是一个SpEL表达式。同时,还可以使用@Value注解的属性指定默认值,例如:

@Value("#{systemProperties['user.home'] ?: '/home/user'}")
private String userHome;

在这个示例中,我们使用?:运算符为userHome属性指定了一个默认值’/home/user’,如果系统属性user.home不存在,则使用默认值。

除了@Value注解外,Spring还提供了其他几个注解,可以用于在注解中使用SpEL表达式,例如@Autowired、@Qualifier和@Resource等。这些注解也支持使用SpEL表达式来实现更灵活的依赖注入和配置。

总之,在Spring中,可以使用@Value注解在注解中使用SpEL表达式,以实现更灵活的依赖注入和配置。在使用SpEL表达式时,需要将表达式放在#{和}之间,并且可以使用@Value注解的属性指定默认值。除了@Value注解外,Spring还提供了其他几个注解,可以用于在注解中使用SpEL表达式。

SpEL是Spring框架提供的一种强大的表达式语言,它允许开发人员在运行时动态地计算表达式,并访问和操作对象图。SpEL表达式可以用在Spring配置文件中,也可以用在代码中。SpEL表达式支持各种操作符、函数和变量,可以用来执行各种复杂的计算和数据操作。SpEL还支持各种高级特性,例如集合投影、列表切片、正则表达式匹配、方法引用、内联列表和内联映射等。使用SpEL可以使开发人员更加高效地编写代码,并提高应用程序的灵活性和可维护性。

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

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

相关文章

WebGL之灯光使用解析

在使用灯光之前&#xff0c;首先我们需要了解&#xff0c;与定义更广泛的 OpenGL 不同&#xff0c;WebGL 并没有继承 OpenGL 中灯光的支持。所以你只能由自己完全得控制灯光。幸运得是&#xff0c;这也并不是很难&#xff0c;本文接下来就会介绍完成灯光的基础。 在 3D 空间中…

使用链表的优先级队列

优先级队列是一种特殊类型的队列&#xff0c;其中每个元素都是与优先级相关联&#xff0c;并根据其优先级提供服务。如果元素有相同的优先级&#xff0c;那么根据它们在队列中的排列顺序。 元素本身的值可以用于分配优先级。例如&#xff1a;最高值的元素被视为最高的优先级元素…

多线程锁.

公平锁与非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁,这里类似排队买票,先来的人先买后来的人在队尾排着,这是公平的Lock lock new Reentrantlock(true);/true表示公平锁,先来先得非公平锁指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请…

类和对象 (中)

文章目录 类的六个默认成员函数构造函数析构函数特性使用 总结构造函数和析构函数拷贝构造函数特性拷贝构造总结 赋值运算符的重载运算符重载赋值运算符重载总结拷贝构造函数和赋值运算符重载 关于operator<<重载日期类实现const 修饰的成员函数取地址重载以及const取地址…

css实现高度是宽度一半的效果

1、方法一&#xff1a;使用变量:root、var()、clac()实现&#xff1a; 1.1 效果如下&#xff1a; 2.2 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title>&l…

伸手党必备之Python正则表达式常用函数

今天介绍一下Python中常用的正则表达式处理函数。Python的正则表达式主要有两种方法完成模式匹配&#xff1a;『搜索』和『匹配』 re.match re.match 尝试从字符串的开始全部或者部分匹配某个模式&#xff0c;如&#xff1a;下面的例子匹配第一个单词。 import re text &…

springboot269反欺诈平台的建设

反欺诈平台设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装反欺诈平台软件来发挥其高效地信息处…

Vue-Vben-Admin:中大型项目后台解决方案及如何实现页面反向传值

Vue-Vben-Admin&#xff1a;中大型项目后台解决方案及如何实现页面反向传值 摘要&#xff1a; Vue-Vben-Admin是一个基于Vue3.0、Vite、Ant-Design-Vue和TypeScript的开源项目&#xff0c;旨在为开发中大型项目提供一站式的解决方案。它涵盖了组件封装、实用工具、钩子函数、动…

学习c语言:单链表的应用

一、单链表经典算法 1.1 单链表相关经典算法OJ题1&#xff1a;移除链表元素 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.…

linux 新增用户 adduser

这里写自定义目录标题 linux 新增用户 Reference: https://dontla.blog.csdn.net/article/details/128723451

WPF监控平台(科技大屏)[一]

跟着B站的视频敲了一个略微复杂的WPF界面,链接如下.在这里我详细的写一份博客进行设计总结. 系统介绍和配置及主窗口设计_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Wy421Y7QD?p1&vd_source4796b18a2e4c1ec8a310391a5644b6da 成果展示 实现过程 总体来说,我的…

蓝桥杯---附近最小(典型的滑动窗口类型问题)

题目链接&#xff1a;附近最小 import java.util.ArrayDeque; import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {static int n;static int[] a;static int k;public static void main(String[] args) {Scanner scannernew Scanner(…

vue - - - - 数据刷新试图不刷新?是不外层有个table?

<table> // ...<customCell :_dataSourcedataSource/>// ... </table>dataSource 更新时&#xff0c;自定义组件对应的是图没有更新 解决办法&#xff1a; 给table加一个变化的key <table key"randomKey"> // ...<customCell :_dataSou…

OpenHarmony开源项目—工程管理

DevEco Studio的基本使用&#xff0c;请参考DevEco Studio使用指南。本章主要介绍如何使用DevEco Studio进行多设备应用开发。 说明&#xff1a; 本章的内容基于DevEco Studio 3.1.1 Release版本进行介绍&#xff0c;如您使用DevEco Studio其它版本&#xff0c;可能存在文档与产…

微信小程序(五十八)分步表单多页面传值

注释很详细&#xff0c;直接上代码 新增内容&#xff1a; 1.分步表单传值 2.伪数据生成 源码&#xff1a; app.json {"pages": ["pages/index/index","pages/building/building","pages/room/room","pages/logs/logs"],&qu…

【项目经验】Redis Sentinel从工程中下线并对业务迁移-进行中

一、背景&#xff1a; 某天&#xff0c;接到DBA通知&#xff0c;Redis sentinel 只支持到3.2.X(这个命题有问题&#xff0c;往下翻&#xff0c;见彩蛋)&#xff0c;为节省运维成本&#xff0c;提升运维效率&#xff0c;决定将工程中使用的Redis sentinel下线&#xff0c;都使用…

关于类和对象超级初级小白知识

下面的内容只是一小部分&#xff0c;在整个面向对象的知识中并不完整&#xff0c;用于记忆和梳理 目录 前言&#xff1a;类和对象是什么&#xff1f; 一、定义类 1.如何定义类 2.类的注意事项 二.类的实例化 1.创建对象的基础知识 2.如何创建对象 3.实例化举例 4.访问对象…

【Python】python实现决策树算法和贝叶斯算法(附源代码)

使用一种你熟悉的程序设计语言&#xff0c;实现&#xff08;1&#xff09;贝叶斯算法和&#xff08;2&#xff09;决策树算法 目录 1、贝叶斯算法2、决策树算法3、两种算法比较 1、贝叶斯算法 import pandas as pd import numpy as np from sklearn.model_selection import t…

蓝桥集训之有序分数

蓝桥集训之有序分数 核心思想&#xff1a;Stern-Brocot Tree 遍历一个区间内的所有最简分数 – – 区间两端分数 分子相加/分母相加 递归 #include<iostream>using namespace std;int n;void dfs(int a,int b,int c,int d) //ac分子 bd分母{if(bd>n) return;dfs(a…

算法-DFS/BFS-XMUOJ提瓦特细胞探秘

题目 思路 这道题目描述了一个矩阵中由数字1至9组成的细胞&#xff0c;这些细胞按照特定规则相互连接。具体规则是&#xff0c;只有当细胞上下左右紧邻的数字同样属于1至9时&#xff0c;它们才会被视为同一细胞的一部分。 解决这个问题的关键在于如何遍历整个矩阵&#xff0c…