Spring中是否有复合属性值

时间:2009-07-23 09:18:19

标签: java spring

我在“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。

3 个答案:

答案 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会导致模式接近程序。