春:外側のクラスのメンバーとしてプライベートインナークラスを注入しますか?
-
23-09-2019 - |
質問
次のクラス構造があります
public class Outer{
private Mapper a;
....
private class MapperA implements Mapper {
}
private class MapperB implements Mapper {
}
}
Spring Configファイルでは、外Beanを作成し、MapperaまたはMapperbの1つをプロパティとして割り当てたいと思います。これは可能ですか?
<bean id="outer" class="mypackage.Outer">
<property name="a" ?????='????' />
</bean>
編集:回答からのフィードバックに基づいて、いくつかの情報:
上記の例で怠zyになりました。マッパーインスタンス変数用のパブリックセッター/ゲッターがあります。
マッパークラスのすべてが内部クラスである理由は、それらの多くが潜在的に存在する可能性があり、このクラスでしか使用されないためです。私は自分のプロジェクトにたくさんのCruftクラスを望んでいません。たぶん、工場の方法はより良いアイデアです。
解決
通常、セッターが必要です Mapper
内部 Outer
, 、および必要なインスタンス Mapper
. 。しかし、これらは次のとおりです。
- プライベート
- 内側
クラス、それは少しトリッキーになります(あなたが特定したように)。あなたがそれらを公開するならば、私はあなたがインスタンスを使用することができると確信しています Outer$MapperA
など。しかし、それは少し厄介なようです。そう:
- 彼らは内的でプライベートである必要がありますか?
- おそらく外側は文字列を取ることができ、それからインスタンス化するかどうかを判断することができます
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>
私の知る限り、あなたが作るまでそれは不可能です MapperA
と MapperB
通常の公開クラス。
しかし、あなたがそれらを内なるプライベートクラスとして保持したい場合は、手動でそれらを「注入」することができます。
でメソッドを作成する必要があります @PostInit
注釈と初期化 a
そこのフィールド(a = new MapperA ()
たとえば、より複雑なもの)。このアプローチを使用すると、スプリング構成で初期化コールバックがオンになっていることも確認する必要があります。