Spring - 将主bean注入属性bean

时间:2011-06-06 11:34:00

标签: java spring dependency-injection

我试图在spring中配置这样的关系:

MyObject myObject = new MyObject();
myObject.setEntity( new Entity(this) );

有可能吗?

当我尝试这样的配置时:

<bean id="myObject" class="MyObject" scope="request">
    <property name="entity">
        <bean class="Entity">
            <constructor-arg ref="myObject"/>
         </bean>
    </property>
</bean>

它返回:     [java]引起:org.springframework.beans.factory.BeanCurrentlyInCreationException:创建名为'myObject'的bean时出错:请求的bean当前正在创建:是否存在无法解析的循环引用?

我正在考虑使用工厂方法,但也许有人有更好的想法?

3 个答案:

答案 0 :(得分:2)

尝试使用setter注入

答案 1 :(得分:2)

首先,引用bean id,而不是类'限定名。

我想,你想做这样的事情:

public class Entity {

 public Entity(A param) {
 // ...
 }
}

public class A {

 public setEntity(A param) {
 // ...
 }
}

我不确定你在创建A时可以注入实体。但是你应该能够这样做:

<bean id="a" class="A">
 <property name="entity">
  <ref local="en" />
 </property>
</bean>

<bean id="en" class="Entity">
 <constructor-arg ref="a" />
</bean>

答案 2 :(得分:1)

我不会尝试通过Spring做到这一切。此外,我会更多地依赖二传手注射:

<!-- applicationContext.xml -->
...
<bean id="main" class="Main">
    ...
    <property name="myObject" ref="myObject"/>
    ...
</bean>

<bean id="entity" class="Entity">
    ...
</bean>
...
<bean id="myObject" class="MyObject" scope="request">
    <property name="entity" ref="entity"/>
</bean>

// your code

public class Main {
    ...
    public void setMyObject(MyObject o) {
        ...
        // Manually inject *this* reference into *entity*
        Entity e = o.getEntity();
        e.setMain(this);
        ...
    }
    ...
}

public class MyObject {
    ...
    public void setEntity(Entity e) {
        ...
    }

    public Entity getEntity() {
        ...
    }
    ...
}

public class Entity {
    ...
    public void setMain(Main m) {
        ...
    }
    ...
}

在上面的示例中,您手动将this注入entity,而不是尝试使用Spring执行此操作。这简化了代码/配置。一切都是通过二传手注射完成的,以避免可能的圆形。