setterインジェクションの配列サポート
これまで、あるコンポーネントが複数のコンポーネントを必要としたとき、addXxx(Xxx xxx)みたいなメソッドを作って、initMethodタグで追加していました。
ただ実際に開発していると、対象となるクラスを追加するたびに、diconファイルを修正する必要があり、めんどくさく思ってました。修正し忘れだとかもあるし。なによりも開発中に設定ファイルを書く量が増えていくってSeasarらしくない!!!
それで、setterメソッドの引数が配列で、配列の要素がインターフェースの場合、自動的にそのインターフェースを実装しているコンポーネントをDIするようにします。例えば、
のようなメソッドを定義しておくと、インターフェースXxxを実装しているコンポーネントを自動でDIするのです。自動でDIさせたくないときは、@Binding(bindingType=BindingType.None)のように指定すればOKです。
public void setXxxs(Xxx[] xxxs);
自動バインディングの改良
Seasar2.3までは、プロパティの型がインターフェースの場合、自動でDIしていましたが、DTOなどで、プロパティの型がListの場合、「対象のコンポーネントがないよ」のワーニングが出てうざったいとの指摘がありました。
それに対応するために、ComponentAutoRegisterでautoBindingを設定できるようにし、DTOの場合は、Noneを設定できるようにしたのですが、これだと、Seasar2.4から多用されるPageクラスでイベントを処理したいときに、他のコンポーネントが自動でDIされなくなります。
それに対応するために、プロパティの型がインターフェースであっても、CollectionやMapに代入可能な型である場合は、自動バインディングの対象からはずしました。