seasar2のコンポーネント自動登録の基本
初めて使ったときに悩んだのでメモ。
コンポーネントの自動登録を理解するために、最もシンプルにしたプロジェクトでサンプルを提示します。
1.自動登録を使用しない場合(プロジェクト名:ComponentManualRegisterSample1)
(1)パッケージ構成
(2)各ソース
ClassAImpl.java
Driver.java
app.dicon
mainを実行した結果
2.自動登録を使用した場合(プロジェクト名:ComponentAutoRegisterSample1)
(1)パッケージ構成
さっきと一緒
(2)各ソース
ClassAImpl.java
Driver.java
(さっきと一緒)
app.dicon
mainを実行した結果
3.いくつか解説
■自動登録する場合のapp.diconについて
app.dicon(抜粋)
1番目の引数は見てわかるとおり、自動登録するクラスのパッケージを指定しているが、
子供のパッケージも再帰的に検索するので、
や、
でも、同様の動きとなった。
ただし、これはだめだった。
デフォルトパッケージに自動登録したいクラスがあった場合、どうすればいいんだろう?
暇なときソースを追いかけてみるか。。。
■DefaultAutoNamingクラスの役割について
Driver.java(抜粋)
コンポーネントの自動登録をしない場合は、app.diconで明示的に「classA」という名前をコンポーネント名に設定している。一方、自動登録する場合には、「classA」というコンポーネント名は、どこにも設定していない。
にもかかわらず、「classA」というコンポーネント名が利用できるのは、app.diconで指定したDefaultAutoNamingクラスが、
app.dicon(抜粋)
自動でクラス名からコンポーネント名を導き出し、設定してるから。
サンプルの場合、以下のとおり。
・クラス名「org.yama.study.pk1.ClassAImpl」からパッケージ部分を除去し「ClassAImpl」という文字列を作成
↓
・「ClassAImpl」のImplを取り除き「ClassA」という文字列を作成
↓
・「ClassA」の先頭を小文字に変換し「classA」の出来上がり
この、変換ルールは、DefaultAutoNamingクラスのプロパティやメソッドで、ある程度変更可能。