2013-04-03 2 views
2

Я, имеющий класс с внутренним классом, как это:Как определить компонент для (нестатического) внутреннего класса весной? Как избежать циклической зависимости

package myPackage; 

public class A { 
    private B b; 

    public void setB(B b) { this.b = b; } 
    public B getB() { return this.b; } 

    public class B { 
    } 
} 

и у меня есть пружинная конфигурация следующим образом:

<bean id="a" class="myPackage.A" autowire="byName" scope="prototype"> 
    <property name="b"> 
     <bean class="myPackage.A$B" name="b" autowire="byName" scope="prototype"> 
      <constructor-arg ref="a"/> 
     </bean> 
    </property> 
</bean> 

Но я обращенный эта ошибка:

org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'a': Requested bean is currently in creation: Is there an unresolvable circular reference? 

Конечно, очевидно, что у меня есть круговая ссылка, но как я могу использовать весенний боб для моего внутреннего класса?

+0

Я не уверен, что вы можете это сделать. Возможно, вместо этого создайте фабричный метод, который возвращает созданный экземпляр 'B'. –

+0

Это единственный способ? Фактически я изменил «B» на статический, и он временно разрешил мою проблему. Однако; Я ищу способ сделать его нестатичным снова. –

ответ

1

Я не уверен, что это может быть разрешено на уровне Весны, если вам нужно a, чтобы его можно было использовать как прототип. Проблема заключается в том, что вы пытаетесь создать экземпляр a, который требует ссылки на b, который, в свою очередь, ссылается на экземплярa (поскольку прототип дает вам новый экземпляр при каждом вводе компонента) , и так далее. Если вы действительно хотите, чтобы a был прототипом bean, содержащим b, который ссылается на тот же, содержащий экземпляр a, тогда вам придется использовать конфигурацию Java или фабричный компонент.

+0

Невозможно изменить область действия 'A' здесь. Вы предполагаете, что если я изменю область «B» на «singleton» вместо «prototype», это решит мою проблему? –

+1

@MatinKh '' Определения, которые вложены внутри '', всегда являются прототипами. Похоже, что самым простым решением будет использование класса верхнего уровня (или статического вложенного) для 'b', а не внутреннего класса, и дать ему метод setContainingA, который экземпляр' a' может вызвать в '@ PostConstruct', а не пытаться выполнить проводку во время строительства. –

+0

Хороший вопрос ... Я этого не знал. Похоже, хороший план, я попробую. –

Смежные вопросы