嗨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
我尝试了下一种方法:
不幸的是,bean name
在bean初始化之前是null
。相信这种方法可能只有在Spring开箱即可提供bean名称且它具有预定义的占位符时才有效。我对吗? Spring有这样的系统变量吗?
Factory
用于动态构建占位符名称。至于我,它可用于生成值,但不能用于占位符名称。
我很感激任何建议!
答案 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);
在循环中使用这段代码,您可以从属性中检索beanName
和role
。