You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用SpEL引用包含表达式的当前对象实例?

在SpEL中引用当前对象实例的方法

没问题!在Spring的SpEL表达式里,有个专门的关键字#this可以用来引用当前被注入的对象实例,刚好能实现你想要的效果。

直接实现你的需求

你只需要把原来写法里的this替换成#this,就能正常调用当前实例的方法了:

@Value("#{otherBean.getClassName(#this.getClass())}")
private String className;

这里的#this就代表当前类的实例,调用#this.getClass()会把当前类的Class对象传给otherBean.getClassName()方法,从而拿到对应的类名。

几个需要注意的点

  • 构造函数注入的限制:如果是在构造函数参数上使用@Value,#this可能无法正常工作——因为此时对象还没完全初始化完成。这种情况下建议改用字段注入或者Setter注入。
  • 代理对象的特殊处理:如果你的类被Spring代理了(比如加了@Transactional、@Cacheable这类注解),#this.getClass()返回的会是代理类而非真实类。这时候可以借助Spring的AopUtils工具类获取真实类:
    @Value("#{otherBean.getClassName(T(org.springframework.aop.support.AopUtils).getTargetClass(#this))}")
    private String realClassName;
    
    要确保org.springframework.aop.support.AopUtils类在你的项目类路径中哦。

完整示例代码

给你一个简单的可运行示例,方便理解:

  1. 先定义提供方法的OtherBean:
@Component
public class OtherBean {
    public String getClassName(Class<?> clazz) {
        return clazz.getSimpleName();
    }
}
  1. 在目标类中使用SpEL注入:
@Component
public class TargetBean {
    @Value("#{otherBean.getClassName(#this.getClass())}")
    private String className;

    public void printClassName() {
        System.out.println("当前类名:" + className); // 输出结果为 "当前类名:TargetBean"
    }
}

这样运行起来就能正确获取到当前类的名称啦!

内容的提问来源于stack exchange,提问作者Dan Markhasin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:26:21