Java Spring中是否有复合属性值
我在“”中阅读了有关复合属性名的信息 我可以使用相同的概念来设置属性值吗?我可以使用复合字符串作为值表达式吗Java Spring中是否有复合属性值,java,spring,Java,Spring,我在“”中阅读了有关复合属性名的信息 我可以使用相同的概念来设置属性值吗?我可以使用复合字符串作为值表达式吗 <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 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>
...
用户是a.b.c.Service1Impl的一个属性,该属性在Spring的控制下不。我想将此属性转发到a.b.c.Service2Impl。Spring的XML连接语法支持列表、映射和属性对象,您可以通过属性编辑器创建其他“数据”对象
编辑:(哦,我知道你在问什么。)我想答案是否定的。我不记得在Spring文档中提到过对bean或非bean对象调用getter,更不用说在wiring文件中使用语法了。它倾向于与谷物相反。Spring连接是声明性的,调用getter会导致模式接近过程性。我不得不做一些类似的事情,恐怕这是不可能的。我必须编写一个
[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,您需要对此进行一些处理。而不是使用普通的旧工厂bean,而是使用工厂方法创建属性的bean,然后注入该结果
瞧
在你的情况下,它看起来像
因此,id为的bean是通过在bean serviceLocator上调用createInstance创建的
现在,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有一个方法getBI suck at life,这要好得多。
<bean id="c" class="C" />
<bean id="b" factory-bean="c" factory-method="getB"/>
<bean id="a" factory-bean="b" factory-method="getA"/>