создание внутренних классов с пружиной - PullRequest
3 голосов
/ 07 января 2010

Каков наилучший подход к созданию нестатического внутреннего класса в Spring?

class A {
  public class B {}

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

это похоже на работу, но я хочу избежать необходимости в аргументе конструктора:

<bean id="a" class="A">
  <property name="b">
    <bean id="b" class="A$B">
      <constructor-arg ref="a"/>
    </bean>
  </property>
</bean>

Ответы [ 2 ]

3 голосов
/ 07 января 2010

В какой-то момент вам нужно указать внешний объект, этого избежать нельзя. Однако вы можете перенести это в Java и из XML, добавив фабричный метод к A, который создает внутреннее B:

public class A {
  public class B {}

  B b;

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

  public B createB() {return new B();} // this is new
}

И тогда вы можете сделать:

<bean id="a" class="test.A">
  <property name="b">
    <bean id="b" factory-bean="a" factory-method="createB"/>
  </property>
</bean>

Так что XML проще, но Java сложнее. Spring достаточно умен, чтобы не расстраиваться из-за очевидных циклических ссылок.

Выберите, вам нужно сделать одно или другое.

2 голосов
/ 07 января 2010

Когда вы создаете экземпляр внутреннего класса (не статический), вам нужна ссылка на внешний класс для его создания. Я не понимаю, как вы можете избежать этого, когда объект B может быть создан только в пределах экземпляра A.

A.B b = new A().new B

или

A a = new A();
A.B b = a.new B();
...