问题(已解决):Spring-Expression中,SpelNodeImpl类的子类BeanReference对应什么场景?

本文探讨了Spring Expression Language (SpEL) 中的BeanReference类及其应用场景。在研究SpEL表达式漏洞的增强方案时,注意到SimpleEvaluationContext.java改变了getBeanResolver()方法,可能是为了限制在bean中使用表达式。然而,通过实验发现BeanReference在测试的场景中并未被构造或调用。进一步研究Spring官方文档后,了解到BeanReference主要在用户自定义BeanResolver处理ExpressionParser.parseExpression(String expression)时发挥作用,而非BeanDefinition中的表达式处理。
摘要由CSDN通过智能技术生成

【背景】

在研究SpEL表达式漏洞官方推出的增强方案时发现,官方推出的SimpleEvaluationContext.java对比StandardEvaluationContext.java修改了一些东西。其中一个就是修改了getBeanResolver()方法的实现,将其返回置为空。分析源码以后,我猜测:SimpleEvaluationContext.java重写getBeanResolver()方法的实现,目的是为了禁止在bean中使用表达式。getBeanResolver()方法调用图如下(虚线表示接口或抽象类的方法):
在这里插入图片描述

【问题描述】

为了验证这个猜想,我写了一个使用bean中使用SpEL的demo,但是发现demo运行时,并没有构造BeanReference类的实例,更没有调用到BeanReference.getValueInternal()方法以及EvaluationContext.getBeanResolver()方法。因此,BeanReference类的作用是什么呢?在什么情况下才能触发这个类的构造以及BeanReference.getValueInternal()方法的执行呢?
我用来测试的demo如下:
Inventor.java(Bean的java对象)

package com.power.bean;

import java.util.Date;
import java.util.GregorianCalendar;

/**
 * @author power
 * @date 2018/10/8 下午2:34
 */
public class Inventor {
    private String name;
    private Date birthday;
    private String nationality;
    private Object random;

    public Inventor() {}

    public Inventor(String name, Date birthday, String nationality) {
        this.name = name;
        this.birthday = birthday;
        this.nationality = nationality;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值