DIされる内容を制御したいと考えていた。
まず思いついたのが、コンポーネントのライフサイクルはSessionなので、
明示的にセッションの内容を上書きすれば、次からDIされるのは、設定した値になると考えた。
早速、試してみたがどうも思った挙動にならない。なるような、ならないような。。
今思えば、別の原因だったのかもしれないが、とりあえずこの方法は断念した。
次に試したのが、コンポーネントのライフサイクルをouterにすることだ。
独自に生成したオブジェクトをDIできるのはいいのだけど、その後、処理した結果を
取得したい場合に、getComponent()できないのが都合が悪く断念した。
次に、コンストラクタインジェクションやら、メソッドインジェクションなど模索してみたが、
望み通りの挙動を得ることが難しかった。
次に、ソースを追っかけて、DIしているところをオーバーライド出来ないか模索したが、
よく分からん。。。
なので、S2Containerでの管理を諦めて、インターセプターとFieldクラスを利用して独自のDIもどきを作成した。
でも、フィールドはpublicにしないといけないし、何かスマートでないし、こんな方法で本当にいいのか
悩んで、もう一度調べなおした。
そこで、一度目にしたけど意味が分からなかった、外部バインディング(=externalBinding)を
再度調べてみた。
そもそも外部コンテキストってなんだ?ってところからだ。
どうも、requestとかsessionようだ。
要は、ExternalContextあるプロパティとcomponentにあるプロパティで、同じものがあれば設定してくれるようだ。
じゃあ、一番最初の方法で良かったのか?ただ、externalBinding 属性をtrueにするだけだったのか?
試してみると、うまく行ってるように見えたけど、何か違う気もする。
そもそも、ExternalContextのプロパティってAPサーバーから提供されるオブジェクトらしいが、それってrequestやsessionそのもののことで、その中身に格納されてるプロパティのことじゃないのかな?
ここ数日ずっと悩んでいるけど、有効な解決策が見つからず。。。
別段、そんなに大したことをしたいわけじゃないのだけどなぁ。
そもそも、SAStrutsを使ってはいるけど、S2Containerのみでの利用経験はないし、
DIの仕組みやら何やらあまり理解せずに使ってきたのが悪かったのだろう。
今回悩んだことで、S2Container自体の理解がちょっとだけ深まったから良しとしよう。