Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring中是否有复合属性值_Java_Spring - Fatal编程技术网

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有一个方法getB

I 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"/>