我有以下课程结构

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

    private class MapperA implements Mapper {

    }

    private class MapperB implements Mapper {

    }
}

在我的Spring Config文件中,我想创建一个外Bean,并将Mappera或Mapperb之一分配为属性。这可能吗?

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

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

  1. 我对上述示例很懒惰。我确实有一个用于Mapper实例变量的公共设置器/Getter。

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

有帮助吗?

解决方案

通常,您需要一个设置器 MapperOuter, ,以及所需的实例 Mapper. 。但是这些是:

  1. 私人的

类,这变得有点棘手(如您所确定的)。如果您将它们公开,我相信您可以使用 Outer$MapperA 等等,但这似乎有点讨厌。所以:

  1. 他们需要内在和私人吗?
  2. 也许外部可以取一个字符串,并从中确定是否实例化 MapperA 或者 MapperB. 。即这里有一些工厂能力。

最简单的事情是真正确定它们是否需要内部/私人。如果是这样,那么实际上不应在配置中引用它们,这应该在谈论公共访问类。

其他提示

春天可以实例化 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> 

据我所知,直到您制作才是不可能的 MapperAMapperB 通常的公共课程。

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

您需要使用 @PostInit 注释并初始化您的 a 那里的字段(a = new MapperA () 例如,或更复杂的东西)。使用这种方法,您还应检查春季配置中的初始化回调是否已切换。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top