Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring:注入一个私有的内部类作为外部类';谁的会员?_Java_Spring_Inner Classes - Fatal编程技术网

Java Spring:注入一个私有的内部类作为外部类';谁的会员?

Java Spring:注入一个私有的内部类作为外部类';谁的会员?,java,spring,inner-classes,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"

我的班级结构如下

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>

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

  • 上面的例子让我很懒。我确实有一个映射器实例变量的公共setter/getter

  • 所有映射器类都是内部类的原因是可能有很多映射器类,并且它们只会在这个类中使用。我只是不想在我的项目中有太多的粗制滥造的课程。也许工厂法更好


  • 通常,您需要在
    外部
    中为
    映射器
    设置一个setter,以及所需的
    映射器
    的一个实例。但事实上:

  • 私人的
  • 内在的
  • 类,这会变得有点棘手(正如您所确定的)。如果您将它们公开,我相信您可以使用
    Outer$MapperA
    等创建一个实例,但这似乎有点令人讨厌。因此:

  • 他们需要内心和隐私吗
  • 也许Outer可以获取一个字符串,并从中确定是实例化
    MapperA
    还是
    MapperB
    。i、 这里有一些工厂的能力

  • 最简单的方法是真正确定他们是否需要内敛/私密。如果是这样的话,那么它们真的不应该在配置中被引用,而配置应该是关于可公开访问的类。

    据我所知,在您创建
    MapperA
    MapperB
    普通的公共类之前,这是不可能的

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


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

    spring可以实例化
    private
    内部类。配置的实际问题是它们也是非静态的,因此您需要一个

    
    
    整洁。我决定使用单独的factory类,但这是一个很好的信息。谢谢。我怀疑这是否有效。Spring如何在没有外部类的封闭实例的情况下创建内部类的实例?@Willi:注意
    。非静态内部类有一个隐式构造函数参数,指向封闭类的实例。要使用反射创建非静态内部类,应该显式传递该参数。Mmh。好吧,我现在没有。不过很有趣。谢谢,我决定为我的映射器使用factory类。谢谢你的建议。我总是忘记@PostInit注释。
    <bean id="outer" class="mypackage.Outer"> 
        <property name = "a">
            <bean class = "mypackage.Outer.MapperA"> 
                <constructor-arg ref = "outer" />
            </bean>
        </property>
    </bean>