2011-01-21 7 views
1

XMLファイルの大部分から生成される静的クラスフィールドにデータを注入したいとします。 カスタムクラス初期化用の軽量クラスローダー?

class Foo { 
    ... 
    static MetaData xxx; 
    static MetaData yyy; 
} 

注入

は、メタデータのインスタンスを構築し、それはFoo.propertiesとは、XXX、YYYのプロパティを解析見つけ、非常に簡単です。

IoCコンテナがこのタスクに役立つかどうかはわかりませんが、そうは思われません。

Fooは、IoCコンテナによってロードされないクラスによって使用される可能性があるためです。

私の考えは、リフレクションに基づいていくつかの特定のクラス初期化コードを追加するためにコンテキストクラスローダーを変更することです。

EDIT多くのIoCコンテナがありますが、そのうちのいくつかは初期化拡張機能をサポートしている可能性があります。

+1

'FooはIoCコンテナによって読み込まれないクラスによって使用される可能性があるので、これは問題ではありませんが、通常IoCでは設定/注釈が必要です。 ClassLoaderを変更せずに、すべてのクラスまたはプロパティファイルを検索し、Class.forNameを呼び出してリフレクションを実行するだけでは、それを行うことはできませんか?実際には、可能であれば、Map >を作成して、すべてを避けることをお勧めします。 – maaartinus

+0

いいえ、Class.forName()を取り除くのが設計の目的です。マップは存在しません。解析/構築プロセスは非常に高速で、MetaDataはメモリフットプリントを減らすための弱い参照です。 –

+0

xxx、yyyを遅延モードで初期化できないのはなぜですか? –

答えて

0

xxx、yyyはで初期化されます。レイジーモード

private static MetaData xxx=null; 
public static MetaData getXXX(){ 
    if(xxx=null){ 
     xxx=parse("Foo.properties"); 
    } 
    return xxx; 
} 

そしてIocのは、あなたのプログラムに絶対必要であれば、春にBeanPostProcessorsを選択することができます次のような

。 BeanPostProcessorでファイルを解析し、MetaDataオブジェクトを作成することができます。

+0

モデルのクラスに数十のMetaDataが生成されています。明示的に構築すると、ソースコードが汚染されます。 –

+0

P.S.遅延初期化を同期させる必要があります。 http://bit.ly/gJdSK2を参照してください。 :) –