在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>
答案 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();