Seasar2.3.8におけるinstance属性の拡張

これまでSeasar2.2.11を使っていて、DefaultProviderやComponentDefImpl、AbstractComponentDeployerを継承して独自に"instance"属性に"shortsession"というスコープを追加していた。
このスコープは実際にはsessionスコープ内のデータとして存在しており、任意のタイミングで中身を削除する機能を追加することで、Webアプリケーションにありがちな「リクエストを跨ったデータをsessionスコープに突っ込みすぎる」という状況を回避するものであった。
で、「そろそろ最新のS2に乗り換えるかな」と思ってSeasar2.3.8のソースを見たら、この辺りの実装がごっそり変わっていた。
InstanceDefFactoryのメソッドがstaticになっていて差し替えられないため、新しい属性値を追加できない。
むー。
「そしたら、それを呼び出しているComponentTagHandlerを継承して、"component"タグを呼び出したときにそっちを使うようにするか?」と思ってS2ContainerTagHandlerRuleやらXmlS2ContainerBuilderやらをみたら、"defaultBuilder"という名前でXmlS2ContainerBuilderのサブクラスをコンポーネント登録すれば実現できそうな感じだった。

ここまで調べてから、Seasar2.2.11を拡張したときのソースを見直したら、そっちでもXmlS2ContainerBuilderを拡張していた。
そもそも"instance"属性の値を増やすとSeasar2DTDと異なってしまうため、独自DTDで検証するコードをXmlS2ContainerBuilderに追加する必要があり、いずれにせよ、根っこから拡張してあげなきゃ動かなかったらしい。

この辺り、もう少しエレガントな拡張方法ってあるのかなぁ。