我在“The Spring Framework (2.5) - Reference Documentation - chapter 3.3.2.7”
中读到了复合属性名称我可以使用相同的概念来设置属性值吗?我可以使用复合字符串作为值表达式吗?
<bean id="service1" class="a.b.c.Service1Impl" scope="prototype">
<property name="service2" ref="service2"/>
<property name="service2.user" value="this-service1-instance.user"/>
</bean>
<bean id="service2" class="a.b.c.Service2Impl" scope="prototype">
...
</bean>
User是a.b.c.Service1Impl的一个属性,它在 中控制着Spring。我想将此属性转发给a.b.c.Service2Impl。
答案 0 :(得分:2)
而不是使用普通的旧工厂bean,而是使用工厂方法创建属性的bean然后注入该结果......
IOW
在您的情况下,它看起来像this ...
<!-- the bean to be created via the factory bean -->
<bean id="exampleBean"
factory-bean="serviceLocator"
factory-method="createInstance"/>
因此,通过在bean serviceLocator上调用createInstance来创建id的bean。
现在spring不支持开箱即用的嵌套属性,但你可以看一下创建一个可能提供支持的自定义编辑器 - 可能但很棘手。可能不值得努力。
您可以使用的一种机制是使用工厂bean工厂方法技术进行嵌套...
类似的东西:
<bean id="c" class="C" />
<bean id="b" factory-bean="c" factory-method="getB"/>
<bean id="a" factory-bean="b" factory-method="getA"/>
这将有效地暴露:a.b.c其中C有一个方法getB而A有一个方法getB
答案 1 :(得分:1)
我必须做类似的事情,我担心这是不可能的。我不得不写一个[FactoryBean][1]
来揭露财产。
它看起来像这样:
public class UserFactory implements BeanFactory {
private Service2 service2;
// ... setter and getter for service2
public Object getObject() {
return getService2().getUser();
}
public Class getObjectType() {
return User.class;
}
public boolean isSingleton() {
// Since it's a prototype in your case
return false;
}
}
考虑一下,在你的情况下,你可能会将工厂本身定义为原型,在这种情况下你的isSingleton()
可能会返回true,你需要稍微玩一下这个
答案 2 :(得分:0)
Spring的XML布线语法支持列表,地图和属性对象,您可以通过属性编辑器创建其他“数据”对象。
编辑:(哦,我明白你在问什么。)我认为答案是肯定的。我不记得曾在Spring文档中看到过在bean或非bean对象上调用getter的提及,更不用说在布线文件中执行此操作的语法了。它往往违背粮食。 Spring布线是声明性的,调用getter会导致模式接近程序。