用spring创建内部类

时间:2010-01-07 07:25:17

标签: java spring inner-classes

在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 个答案:

答案 0 :(得分:3)

在某些时候,你需要指定外部对象,没有避免这种情况。但是,您可以通过向创建内部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 } 的{​​{1}}添加工厂方法,将其移至Java中,并从XML中移出。

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

然后你可以这样做:

{{1}}

因此XML更简单,但java更复杂。 Spring很聪明,不会对明显的循环引用感到不安。

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

答案 1 :(得分:2)

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

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

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