4

私は次のクラス構造を持っています

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 インスタンス変数のパブリック セッター/ゲッターがあります。

  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

Mapper通常、 withinのセッターとOuter、 required のインスタンスが必要ですMapper。しかし、これらは次のとおりです。

  1. プライベート
  2. インナー

クラス、それは少しトリッキーになります(あなたが特定したように)。公開すれば、etc を使ってインスタンスを作成できると思いますが、Outer$MapperAそれは少し厄介なようです。そう:

  1. 彼らは内側とプライベートである必要がありますか?
  2. おそらく Outer は String を取り、それからインスタンス化するMapperAMapperB. つまり、ここにはいくつかの工場機能があります。

最も簡単なことは、それらが内部/非公開である必要があるかどうかを実際に判断することです。もしそうなら、彼らは実際には構成内で参照されるべきではなく、一般にアクセス可能なクラスについて話しているはずです。

于 2010-02-26T20:10:20.923 に答える
1

私の知る限りMapperAMapperB通常の公開クラスを作成するまでは不可能です。

ただし、それらを内部プライベート クラスとして保持したい場合は、手動で「注入」できます。

@PostInitアノテーションを使用してメソッドを作成し、aそこでフィールドを初期化する必要があります(a = new MapperA ()たとえば、またはより複雑なもの)。このアプローチでは、Spring 構成で初期化コールバックがオンになっていることも確認する必要があります。

于 2010-02-26T20:15:31.723 に答える