4

我有以下类结构

public class Outer{
    private Mapper a;
    ....

    private class MapperA implements Mapper {

    }

    private class MapperB implements Mapper {

    }
}

在我的 Spring 配置文件中,我想创建一个 Outer bean,并将 MapperA 或 MapperB 之一分配为属性。这可能吗?

<bean id="outer" class="mypackage.Outer">
    <property name="a" ?????='????' />
</bean>

编辑:更多信息,基于答案的反馈:

  1. 我对上面的例子变得懒惰了。我确实有一个用于 Mapper 实例变量的公共 setter/getter。

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

4

3 回答 3

7

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> 
于 2010-02-26T20:26:44.237 回答
1

通常你需要一个用于Mapperwithin的 setterOuter和一个 required 的实例Mapper。但因为这些是:

  1. 私人的

类,这变得有点棘手(正如您所确定的)。如果您将它们公开,我相信您可以使用Outer$MapperAetc 创建一个实例。但这似乎有点讨厌。所以:

  1. 他们需要内在和私密吗?
  2. 也许 Outer 可以接受一个字符串,并从中确定是实例化MapperA还是MapperB. 即这里有一些工厂能力。

最简单的事情是真正确定他们是否需要内在/私密。如果是这样,那么它们真的不应该在配置中被引用,它应该谈论可公开访问的类。

于 2010-02-26T20:10:20.923 回答
1

据我所知,除非您参加通常的公开课程,否则这是不可能MapperAMapperB

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

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

于 2010-02-26T20:15:31.723 回答