我正在尝试使用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创建)
答案 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依赖注入框架。虽然你可能有一个有效的用例,但你需要非常小心。