【问题标题】:creating inner classes with spring用spring创建内部类
【发布时间】:2010-01-07 07:25:17
【问题描述】:
在 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>
【问题讨论】:
标签:
java
spring
inner-classes
【解决方案1】:
在某些时候,您需要指定外部对象,这是无法避免的。但是,您可以通过将工厂方法添加到 A 来创建内部 B,从而将其移入 Java 并移出 XML:
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】:
当您实例化一个内部类(非静态)时,您需要外部类引用来创建一个。当对象 B 只能在 A 的实例范围内创建时,我不明白如何避免它。
A.B b = new A().new B
或
A a = new A();
A.B b = a.new B();