27. Spring源码篇之SpEL表达式之自定义解析模版

简介

其实前面文章我们已经介绍过了如何定义spring表达式的解析模版,但是那是直接使用表达式api的形式,对于使用spring的同学来说,更优雅的方式就是可以自定义一个扩展去修改

本文就是介绍如何通过Spring的扩展点修改表达式解析模版

自定义解析模版

首先AbstractBeanFactory就有有一个解析器BeanExpressionResolver,这个前面文件介绍过,默认是一个StandardBeanExpressionResolver

public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {private BeanExpressionResolver beanExpressionResolver;public BeanExpressionResolver getBeanExpressionResolver() {return this.beanExpressionResolver;}
}

而StandardBeanExpressionResolver恰好也有修改解析版本的方法

public class StandardBeanExpressionResolver implements BeanExpressionResolver {public void setExpressionPrefix(String expressionPrefix) {this.expressionPrefix = expressionPrefix;}public void setExpressionSuffix(String expressionSuffix) {this.expressionSuffix = expressionSuffix;}
}

那么其实就是对BeanFactory的一个扩展,在spring中针对于BeanFactory的后置处理器就是 BeanFactoryPostProcessor

下面我们就来实现一下

@Component
public class SpElPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {BeanExpressionResolver beanExpressionResolver = beanFactory.getBeanExpressionResolver();if (beanExpressionResolver instanceof StandardBeanExpressionResolver) {StandardBeanExpressionResolver resolver = (StandardBeanExpressionResolver) beanExpressionResolver;// 修改resolver.setExpressionPrefix("&{");resolver.setExpressionSuffix("}");}}
}

修改表达式模版为 &{}

测试

@ComponentScan({"com.shura"})
public class AppConfig {
}public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);BeanExpressionResolver beanExpressionResolver = context.getBeanFactory().getBeanExpressionResolver();Object result = beanExpressionResolver.evaluate("&{appConfig}", new BeanExpressionContext(context.getBeanFactory(), null));System.out.println(result);
}输出
com.shura.config.AppConfig@3e58a80e

欢迎关注,学习不迷路!

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

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

相关文章

【Linux】信号

Linux 信号 1.信号介绍2.core dump3.发送信号3.1.kill3.2.send3.3.abort 4.信号产生4.1.软件条件产生信号4.1.1.SIGPIPE4.1.2.SIGALRM 4.2.硬件异常产生信号 5.信号处理6.可重入函数 & volatile7.SIGCHLD 1.信号介绍 信号本质是一种通知机制。 而进程要处理信号&#xff0…

windows通过regsvr32注册dll文件失败

1、注册dll文件失败 最近在研究中文输入法,下载SampleIME源码后编译得到SampleIME.dll,最后只需要将输入法安装(即注册)就可以使用了。 但是通过命令: regsvr32 C:\Windows\System32\SampleIME.dll 注册时却提示错…

【3 栈和队列】链队的操作。

结构体: typedef struct QNode{int data;struct QNode *next; }QNode;typedef struct{QNode *front,*rear; }*LinkQueue; 初始化、判空: void InitQueue(LinkQueue &Q){ //初始化 Q.frontQ.rear(QNode*)malloc(sizeof(QNode)); //建立头结点…

6.2 Windows驱动开发:内核枚举SSSDT表基址

在Windows内核中,SSSDT(System Service Shadow Descriptor Table)是SSDT(System Service Descriptor Table)的一种变种,其主要用途是提供Windows系统对系统服务调用的阴影拷贝。SSSDT表存储了系统调用的函数…

光线追踪-Peter Shirley的RayTracing In One Weekend系列教程(book1-book3)代码分章节整理

自己码完了一遍了,把代码分章节整理了一下,可以按章节独立编译,运行, 也可以直接下载编译好的release版本直接运行。 项目地址: Github: https://github.com/disini/RayTracingInOneWeekendChaptByChapt ​ ​ ​ ​

transformers pipeline出现ConnectionResetError的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

如果客户端同时有ipv4和ipv6,浏览器是如何选择用哪种ip

在互联网协议(IP)的发展历程中,IPv4和IPv6是两种主要的版本。对于一个客户端来说,同时拥有IPv4和IPv6的能力是常见的情况。那么,当一个客户端同时具有IPv4和IPv6的能力时,浏览器是如何选择使用哪种IP进行通…

内容运营常用的ChatGPT通用提示词模板

内容定位:请帮助我明确我们的内容定位,包括目标受众、内容类型、主题、风格等方面的内容,以便我能够更好地制定内容策略和规划。 内容策划:请帮助我制定一个详细的内容策划方案,包括内容主题、风格、形式、发布时间等…

软件测试高职教师组比赛复盘

1、考试分为四个模块: 任务1:自动化测试30分,4道题 任务2:单元测试20分,4道题 任务3:接口测试20分,2道题 任务4:性能测试30分,LoadRunner和Jmeter两个。 2、考试时间…

linux复习笔记05(小滴课堂)

hell脚本与crontab定时器的运用 查看状态: 关闭服务: 开启服务: 重启服务: crontab定时器的使用: 我们可以看到没有任何任务。 编辑: 我们可以看到这个任务了。 删除所有任务: 这代表着每分钟…

5.一维数组——输入一行字符,统计其中各个大写字母出现的次数。

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 四、举一反三一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为一维数组编程题,点滴成长,一起逆袭。 一、题目描述 输入一行字符,统计其中各个大写字母出现的…

Android控件全解手册 - 自定义ViewGroup卫星导航菜单

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列

Redis序列化操作

目录 1.protostuff 的 Maven 依赖 2.定义实体类 3.序列化工具类 ProtostuffSerializer 提供了序列化和反序列化方法 4.测试 利用 Jedis 提供的字节数组参数方法,如: public String set(String key, String value) public String set(byte[] key…

LeetCode 1457. 二叉树中的伪回文路径

原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 耗时&#xff1a;28min48s C代码 dfs、二叉树前序遍历、哈希表记录 #include<bits/stdc.h> using namespace std;struct TreeNode {int val;TreeNode *left;TreeNode *rig…

HarmonyOS(六)——@Builder装饰器

前言 前面章节介绍了如何创建一个自定义组件以及认识页面和自定义组件生命周期。明白了自定义组件内部UI结构固定&#xff0c;仅与使用方进行数据传递。同时明白了自定义组件对应生命周期的机制管理。ArkUI还提供了一种更轻量的UI元素复用机制Builder&#xff0c;Builder所装饰…

CentOS7部署FTP服务器

首先准备一台centos7虚拟机&#xff0c;作为服务器IP地址必须是固定的。 vim /etc/sysconfig/network-scripts/ifcfg-ens33配置内容如下&#xff1a; TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no" BOOTPROTO"static" DEFROU…

【Vue3+Vite】解决build后空白页的问题

目录 Hash 模式 HTML5 模式&#xff08;历史模式&#xff09; 配置Nginx 配置Spring Boot Hash 模式 build后空白页的问题可能是使用的是历史模式&#xff0c;因为Vue是一个单页的客户端应用&#xff0c;如果没有适当的服务器配置&#xff0c;访问会得到一个 404 错误…

【研究中2】sql server权限用户设置

--更新时间2023.11.26 21&#xff1a;30 负责人&#xff1a;jerrysuse DBAliCMSIF EXISTS (select * from sysobjects where namehkcms_admin)--判断是否存在此表DROP TABLE hkcms_adminCREATE TABLE hkcms_admin (id int identity(1, 1),--id int primary key identity…

静态路由配置过程

静态路由 静态路由简介 路由器在转发数据时&#xff0c;要先在路由表&#xff08;Routing Table&#xff09;中在找相应的路由&#xff0c;才能知道数据包应该从哪个端口转发出去。路由器建立路由表基本上有以下三种途径。 &#xff08;1&#xff09;直连路由&#xff1a;路由…

HDMI接口信号流向及原理图分析

1、HDMI的来源及发展 如今显示器上最常用的接口无非HDMI&#xff08;High Definition Multimedia Interface&#xff09;与DP&#xff08;DisplayPort&#xff09;两种&#xff0c;VGA与DVI已经很少使用&#xff0c;原因在于VGA传输的是模拟信号&#xff0c;在发送端需要将数字…