-豆知識: コンポーネント初期化Type
Seasar2は、AOP機能が組み込まれたIoCコンテナ(S2Container)を中心にひがさんが再構築中です。今のEA2でもコンテナの機能はほぼ完成しています。今後はこのコンテナに標準搭載する基本コンポーネント群の整備や、コンテナのブートストラップサーバーの提供などが順次されていくでしょう。ところで、このIoCコンテナは一般的に広く議論されているところで、以下の二種類があります。
- Type2 プロパティベース
- Type3 コンストラクタベース
IoCコンテナはシングルトンでコンポーネントを生成してキャッシュするか、要求時に都度生成するかしますが、それぞれコンポーネント生成時に、デフォルトコンストラクタで生成してDeploymentDescriptor(DD)の設定をBeanプロパティによって反映させるType2と、引数を持つコンストラクタでDD設定を反映した生成を行うType3に分類されています。Type1というのがあるのかどうか、Type4以降があるかどうかは、不覚にも私は知りません。
S2ContainerはこのType2およびType3をハイブリッドに採用している上、他のコンテナでもライフサイクル管理として実現されているイニシャライズメソッドコールを含めた三様のDD設定反映機構を持ちます。仮にここではこのメソッドコールをType1と呼んでおきます。MLでの議論より想像した次もしくはその次のリリースで再整理される機構を先取りして説明すると、
<!-- Type3 --> 'masataka' 'kurihara' <!-- Type2 -->31 'Tokyo' <!-- Type1 -->'mai' true 'maya'
この例における、コンポーネント側からみたコンテナの動きは
<--Type3 --> new PersonImpl("masataka", "kurihara"); <--Type2 --> masataka.setAge(31); masataka.setAddress("Tokyo"); <--Type1 --> masataka.addFamily(new PersonImpl("mai"), true); masataka.addFamily(new PersonImpl("maya"));
と同じ結果をもたらす動作をリフレクションを利用して行います。
IoCコンテナのコンポーネントはごく普通のJavaオブジェクト(POJO)ですから、新しく作るもののみならず、IoCコンテナなど知らない古い既存のものを載せることもできます。その際に既存クラスの初期化方法はType1、Type2、Type3を組み合わせたものが要求されることもあるでしょう。このへん、S2Containerはなんでもこい!という柔軟さがあります。今後リリースされる他のIoCコンテナでも皆こうなるのではないかと思います。
昨日、お風呂タイムに四番目の初期化手法が存在するかどうか考えましたが、思いつきませんでした。