如何获取当前bean名称/ id以在bean初始化中使用它来构建占位符名称

时间:2015-02-02 10:40:20

标签: java spring

嗨Spring Framework专家!

我需要使用占位符配置10个以上的类似bean。它们之间的唯一区别是唯一占位符键(${bean1.key}${bean2.key}等等)。如果我直接做,我应该复制bean定义10次以上并且只更改占位符的第一部分。所以我在想如何避免这种重复。

我想动态生成占位符字符串。作为动态部分,我想使用当前bean ID(或者它的字段值)。 它应该是这样的。

<!-- Template -->
<bean id="mainProfile" abstract="true" class="com.company.SomeClass">
    <property name="role" value="${${this.beanName}.role:NA}">
    <!-- other properties initialized in same way -->
</bean>
<!-- Instances -->
<bean id="profile1" parent="mainProfile"/>
<bean id="profile2" parent="mainProfile"/>
<bean id="profile3" parent="mainProfile"/>

结果,可以通过向role添加下一行来初始化所有bean的属性app.properties

profile1.role=admin
profile2.role=guest
profile3.role=editor

我尝试了下一种方法:

  1. BeanNameAware + SpEL
  2. 不幸的是,bean name在bean初始化之前是null。相信这种方法可能只有在Spring开箱即可提供bean名称且它具有预定义的占位符时才有效。我对吗? Spring有这样的系统变量吗?

    1. Factory用于动态构建占位符名称。
    2. 至于我,它可用于生成值,但不能用于占位符名称。

      我很感激任何建议!

2 个答案:

答案 0 :(得分:0)

为什么不这样做:

<!-- Template -->
<bean id="mainProfile" abstract="true" class="com.company.SomeClass">
    <!-- other properties initialized in same way -->
</bean>

<!-- Instances -->
<bean id="profile1" parent="mainProfile">
    <property name="role" value="${profile1.role}">
</bean>
<bean id="profile2" parent="mainProfile">
    <property name="role" value="${profile.role}">
</bean>
<bean id="profile3" parent="mainProfile">
    <property name="role" value="${profile3.role}">
</bean>

答案 1 :(得分:0)

解决方案可能是以编程方式声明bean而不是使用XML。

您可以使用GenericBeanDefinition类以这样的方式定义对象:

GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDef.setBeanClass(com.company.SomeClass);

MutablePropertyValues values = new MutablePropertyValues();
values.addPropertyValue("name", beanName);
values.addPropertyValue("role", role);

beanDefinition.setPropertyValues(values);

在循环中使用这段代码,您可以从属性中检索beanNamerole