我有以下类结构
public class Outer{
private Mapper a;
....
private class MapperA implements Mapper {
}
private class MapperB implements Mapper {
}
}
在我的Spring配置文件中,我想创建一个外部bean,并将MapperA或MapperB中的一个指定为属性。这可能吗?
<bean id="outer" class="mypackage.Outer">
<property name="a" ?????='????' />
</bean>
编辑:根据答案的反馈提供更多信息:
我对上面的例子很懒。我确实有Mapper实例变量的公共setter / getter。
所有Mapper类都是内部类的原因是因为它们可能有很多,并且它们只会在这个类中使用。我只是不想在我的项目中使用大量的课程。也许工厂方法是一个更好的主意。
答案 0 :(得分:6)
Spring可以实例化private
内部类。您的配置的实际问题是它们也不是static
,因此您需要<constructor-arg .../>
:
<bean id="outer" class="mypackage.Outer">
<property name = "a">
<bean class = "mypackage.Outer.MapperA">
<constructor-arg ref = "outer" />
</bean>
</property>
</bean>
答案 1 :(得分:1)
通常,您需要Mapper
中的Outer
的设置器,以及所需Mapper
的实例。但是因为这些是:
类,这有点棘手(正如您所确定的那样)。如果你公开它们,我相信你可以使用Outer$MapperA
等创建一个实例。但这似乎有点令人讨厌。所以:
MapperA
或MapperB
。即这里有一些工厂能力。最简单的方法是确定他们是否需要内部/私人。如果是这样,那么它们实际上不应该在配置中被引用,这应该是在讨论可公开访问的类。
答案 2 :(得分:1)
据我所知,在你通常的MapperA
和MapperB
公共课程之前,这是不可能的。
但是如果你确实希望将它们保留为内部私有类,那么你可以手动“注入”它们。
您需要使用@PostInit
注释创建方法并在那里初始化您的a
字段(例如a = new MapperA ()
或更复杂的内容)。使用这种方法,您还应该检查弹簧配置中是否已打开初始化回调。