SpEL:在bean实例化期间获取当前bean名称

时间:2018-01-24 21:11:15

标签: java spring annotations spring-el

我正在尝试使用SpEL来获取当前正在实例化的bean的名称,以允许使用@PropertySource提供的不同属性创建同一类的多个bean。我希望得到以下内容:

public class SampleBean {
    @Value("${#{CurrentBeanName}.val}")
    private String val
}

其他豆子:

public class OtherBean {

    @Autowired
    @Qualifier(name="BeanA")
    SampleBean beanA;

    @Autowired
    @Qualifier(name="BeanB")
    SampleBean beanB;
}

属性文件:

BeanA.val=VALUE A
BeanB.val=VALUE B

如果我将beanName=BeanA添加到我的属性文件中,我可以将其与

一起使用
@Value("${${beanName}.val}")

有关如何处理#{BeanName}的任何想法?如果这是不可能的那么就是这样,但如果它有效,它将比我目前的解决方案更清洁。

编辑:

或者从xml bean定义向SpEL传递常量的任何方法?例如:

<bean id="BeanA" class="...">
    <property name="prefix" value="BeanA"/>
</bean>

的java:

public class SampleBean {
    @Value("${#{prefix}.val}")
    private String val
}

任何类型的属性或任何可行的方法

EDIT2:

这在旧的基于XML的配置

中是微不足道的

spring.xml:

<bean id="beanA" class="SampleBean">
    <property name="val" value="${BeanA.val}"/>
</bean>
<bean id="beanB" class="SampleBean">
    <property name="val" value="${BeanB.val}"/>
</bean>

SampleBean.java:

public class SampleBean {

    private String val;

    public void setVal (String val) {
        this.val = val;
    }
}

然而,当切换到新的@Value注释以摆脱所有的setter时,似乎不支持具有diff属性的非单例(即无法动态过滤@Value个参数关于bean创建)

2 个答案:

答案 0 :(得分:1)

没有;无法引用当前的bean。

修改

要在下面提供您的评论,请将Java配置等效于

<bean id="BeanA" class="com.my.Foo">
    <property name="prefix" value="BeanA"/>
</bean>

@Bean
public Foo BeanA() {
    Foo a = new Foo();
    a.setPrefix("BeanA");
}

虽然按照惯例,您可能会将其命名为beanA

答案 1 :(得分:0)

如果您有单例bean类型,可以使用static final变量作为名称,然后引用它。但更大的问题是,如果你开始依赖Spring bean名称,你将打破控制主体的Spring反转,这就是为什么没有这样做的原因。非常希望专注于为您的项目创建模块和域。如果您开始直接访问来自Spring Context的组件(例如bean名称),您会发现您的模块将变得脆弱,难以更改并且很难推理,因为它们开始依赖于看似不相关的模块的行为,例如作为Spring依赖注入框架。虽然你可能有一个有效的用例,但你需要非常小心。