无需实现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
相关产品推荐
相关产品推荐

