【问题标题】:Spring - Injecting main bean into property beanSpring - 将主bean注入属性bean
【发布时间】:2011-09-09 05:37:09
【问题描述】:

我正在尝试在 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:是否存在无法解析的循环引用?

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

【问题讨论】:

  • 什么是ref="com.electrabel.relay.BounceRelay"

标签: java spring dependency-injection


【解决方案1】:

试试setter注入

【讨论】:

  • 不工作。与构造函数注入相同的异常。
【解决方案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>

【讨论】:

  • 不工作。也许春天有任何延迟初始化?
【解决方案3】:

我不会尝试通过 Spring 完成所有这些工作。另外我会更多地依赖 setter 注入:

<!-- 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 执行此操作。这简化了代码/配置。此外,一切都是通过 setter 注入完成的,以避免可能的循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-06
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2015-12-14
    相关资源
    最近更新 更多