Весна - введение основного компонента в свойство bean - PullRequest
1 голос
/ 06 июня 2011

Я пытаюсь настроить такое отношение весной:

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': запрашиваемый компонент находится в процессе создания: существует неразрешимая круговая ссылка?подумываете об использовании фабричного метода для этого, но, может быть, у кого-то есть идея получше?

Ответы [ 3 ]

2 голосов
/ 06 июня 2011

Во-первых, ссылка ссылается на идентификатор компонента, а не на квалифицированное имя класса.

Я думаю, вы хотите сделать что-то вроде этого:

public class Entity {

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

public class A {

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

Я не уверен, что выможет ввести Entity при создании 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 голосов
/ 06 июня 2011

Попробуйте с впрыском в сеттер

1 голос
/ 06 июня 2011

Я бы не стал делать все это через 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. Это упрощает код / ​​настройку. Кроме того, все делается с помощью инжектора, чтобы избежать возможных закруглений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...