如何使用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类在你的项目类路径中哦。
完整示例代码
给你一个简单的可运行示例,方便理解:
- 先定义提供方法的
OtherBean:
@Component public class OtherBean { public String getClassName(Class<?> clazz) { return clazz.getSimpleName(); } }
- 在目标类中使用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
相关产品推荐
相关产品推荐

