我试图在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当前正在创建:是否存在无法解析的循环引用?
我正在考虑使用工厂方法,但也许有人有更好的想法?
答案 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执行此操作。这简化了代码/配置。一切都是通过二传手注射完成的,以避免可能的圆形。