3

在 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>
4

2 回答 2

3

在某些时候,您需要指定外部对象,这是无法避免的。但是,您可以通过向其添加A创建内部的工厂方法将其移入 Java 并移出 XML 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 足够聪明,不会对明显的循环引用感到不安。

任你选择,你需要做一个或另一个。

于 2010-01-07T13:27:21.603 回答
2

当您实例化一个内部类(非静态)时,您需要外部类引用来创建一个。当对象 B 只能在 A 的实例范围内创建时,我不明白如何避免它。

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

或者

A a = new A();
A.B b = a.new B();
于 2010-01-07T07:29:15.493 回答