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

无需实现BeanNameAware接口,如何获取Spring Bean名称?

解决方法:用Spring SpEL表达式注入Bean名称

我之前也碰到过类似的场景,刚好可以用Spring XML自带的SpEL表达式搞定,完全不需要给你的库加Spring依赖,也不用重复配置bean名称,步骤超简单:

1. 保留类中的setBeanName方法

确保你的类仍然有一个普通的setBeanName(String beanName) setter方法就行——不需要实现BeanNameAware接口,就是个普通的Java方法:

public class YourClass {
    private String beanName;

    public void setBeanName(String beanName) {
        this.beanName = beanName;
        // 原来依赖BeanNameAware时的逻辑可以原样保留
    }
}

2. 在Spring XML中用SpEL自动注入Bean名称

配置bean的时候,通过SpEL表达式#{this.beanName}自动获取当前bean的名称,注入到setter方法里:

<bean id="yourBeanId" class="com.your.package.YourClass">
    <property name="beanName" value="#{this.beanName}" />
</bean>

关键细节说明:

  • #{this}在当前bean的属性注入上下文里,指代的就是正在实例化的bean本身,this.beanName会直接拿到Spring容器中这个bean的名称(优先取id,如果配置了name属性则取第一个别名,和BeanNameAware的行为完全一致)。
  • 这种方式完全不需要你的类依赖任何Spring API,完美适配你把类迁移到无Spring依赖库的需求。
  • 不用手动重复输入bean名称,彻底避免了硬编码带来的维护隐患。

如果你的bean配置了多个别名(比如<bean name="alias1,alias2" ...>),#{this.beanName}会返回第一个别名,和原来实现BeanNameAware时的逻辑完全匹配,不会影响原有业务。

内容的提问来源于stack exchange,提问作者Tim B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:29:43