ひがやすを技術ブログ

電通国際情報サービスのプログラマ

setterインジェクションの配列サポート

これまで、あるコンポーネントが複数のコンポーネントを必要としたとき、addXxx(Xxx xxx)みたいなメソッドを作って、initMethodタグで追加していました。












ただ実際に開発していると、対象となるクラスを追加するたびに、diconファイルを修正する必要があり、めんどくさく思ってました。修正し忘れだとかもあるし。なによりも開発中に設定ファイルを書く量が増えていくってSeasarらしくない!!!
それで、setterメソッドの引数が配列で、配列の要素がインターフェースの場合、自動的にそのインターフェースを実装しているコンポーネントをDIするようにします。例えば、

public void setXxxs(Xxx[] xxxs);
のようなメソッドを定義しておくと、インターフェースXxxを実装しているコンポーネントを自動でDIするのです。自動でDIさせたくないときは、@Binding(bindingType=BindingType.None)のように指定すればOKです。

自動バインディングの改良

Seasar2.3までは、プロパティの型がインターフェースの場合、自動でDIしていましたが、DTOなどで、プロパティの型がListの場合、「対象のコンポーネントがないよ」のワーニングが出てうざったいとの指摘がありました。
それに対応するために、ComponentAutoRegisterでautoBindingを設定できるようにし、DTOの場合は、Noneを設定できるようにしたのですが、これだと、Seasar2.4から多用されるPageクラスでイベントを処理したいときに、他のコンポーネントが自動でDIされなくなります。
それに対応するために、プロパティの型がインターフェースであっても、CollectionやMapに代入可能な型である場合は、自動バインディングの対象からはずしました。