Spring:将私有内部类注入外部类的成员?

时间:2010-02-26 20:06:18

标签: java spring inner-classes

我有以下类结构

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>

编辑:根据答案的反馈提供更多信息:

  1. 我对上面的例子很懒。我确实有Mapper实例变量的公共setter / getter。

  2. 所有Mapper类都是内部类的原因是因为它们可能有很多,并且它们只会在这个类中使用。我只是不想在我的项目中使用大量的课程。也许工厂方法是一个更好的主意。

3 个答案:

答案 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的实例。但是因为这些是:

  1. 私有
  2. 类,这有点棘手(正如您所确定的那样)。如果你公开它们,我相信你可以使用Outer$MapperA等创建一个实例。但这似乎有点令人讨厌。所以:

    1. 他们需要内心和私人吗?
    2. 也许Outer可以使用String,并从中确定是否实例化MapperAMapperB。即这里有一些工厂能力。
    3. 最简单的方法是确定他们是否需要内部/私人。如果是这样,那么它们实际上不应该在配置中被引用,这应该是在讨论可公开访问的类。

答案 2 :(得分:1)

据我所知,在你通常的MapperAMapperB公共课程之前,这是不可能的。

但是如果你确实希望将它们保留为内部私有类,那么你可以手动“注入”它们。

您需要使用@PostInit注释创建方法并在那里初始化您的a字段(例如a = new MapperA ()或更复杂的内容)。使用这种方法,您还应该检查弹簧配置中是否已打开初始化回调。