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

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 {
    @Override
    public 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.kler.cn/a/145974.html

相关文章:

  • 【2025】拥抱未来 砥砺前行
  • 麦田物语学习笔记:创建TransitionManager控制人物场景切换
  • MySQL中日期和时间戳的转换:字符到DATE和TIMESTAMP的相互转换
  • 51c自动驾驶~合集48
  • Agent AI: 强化学习,模仿学习,大型语言模型和VLMs在智能体中的应用
  • 数据库管理-第285期 Oracle 23ai:深入浅出向量索引(20250117)
  • leetcode 最大整除子集
  • 【网络奇幻之旅】那年我与大数据的邂逅
  • VMWare虚拟机ubuntu克隆打不开
  • 如果客户端同时有ipv4和ipv6,浏览器是如何选择用哪种ip
  • Ubuntu20.04清理垃圾vscode缓存
  • ChatGPT初体验:注册、API Key获取与ChatAPI调用详解
  • RT-DETR论文阅读笔记(包括YOLO版本训练和官方版本训练)
  • PTA NeuDS-数据库题目集
  • 手把手教会你--渗透实战--Hack The Box-Starting Point-Meow--持续更新
  • MT6893_天玑 1200芯片规格参数介绍_datasheet规格书
  • 【深度学习】因果推断与机器学习的高级实践 | 数学建模
  • Rust语言入门教程(八) - 引用与借用
  • leetcode 41. 缺失的第一个正数
  • 【brpc学习实践十】streaming log实战
  • 【数据结构 —— 堆的实现(顺序表)】
  • 【研究中2】sql server权限用户设置
  • Python 进阶(十):数学计算(math 模块)
  • 机器学习笔记 - 3D对象检测技术路线调研(未完)
  • SpringCloud之Gateway(统一网关)
  • C语言第三十三弹---交换变量(不使用临时变量)