繁体   English   中英

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

[英]Spring: Injecting a private inner class as an outer class's member?

我有以下类结构

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

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> 

通常,您需要在Outer使用Mapper的setter,以及所需Mapper的实例。 但是因为这些是:

  1. 私人的

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

  1. 他们需要内心和私人吗?
  2. 也许Outer可以接受一个String,并从中确定是否实例化MapperAMapperB 即这里有一些工厂能力。

最简单的方法是真正确定它们是否需要内部/私有。 如果是这样,那么它们实际上不应该在配置中被引用,这应该是在讨论可公开访问的类。

据我所知,在你制作MapperAMapperB常用的公共类之前是不可能的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM