Login判定変更

作成した login画面から、( jxpath, com )と入力した時だけ、ログインに成功して、
下の図が表示されますね。そうなるようにプログラムしたから当然です。

では、これから DIコンテナの威力で LoginCtrl.java を 1行も書き換えずに、
login可能なユーザを ( suzuki, ichiro ), ( matsui, hideki ), ( matsuzaka, daisuke )に
変更してみます。

LoginLogicMap.java 作成

下図に示す LoginLogicMap.java というソースを com.jxpath.springweb.logic パッケージに
追加します。

BaseBean.xmlに追記

次に、BaseBean.xmlに、上で作成した LoginLogicMap を登録します。

SpringWeb2-servlet.xmlを変更

SpringWeb2-servlet.xml の以下の行を更新します。
更新前:<property name="loginLogic"><ref bean="loginLogicDummy"/></property>
更新後:<property name="loginLogic"><ref bean="loginLogicMap"/></property>

再起動

これで、「mvn package」を実行後、tomcatを再起動してください。
( suzuki, ichiro ), ( matsui, hideki ), ( matsuzaka, daisuke )の3人がログイン可能ですね。

何が起きたのか

上記の変更は、DIコンテナの機能を2箇所で使っています。

  1. LoginLogicMap.javaの mUserMap に3人のアカウント情報を格納
  2. LoginCtrl.javaの mLoginLogic を LoginLogicDummyからLoginLogicMapに変更

1. LoginLogicMap.javaの mUserMap に3人のアカウント情報を格納

BaseBean.xmlに追記した内容には、「userMapというpropertyに、3人のアカウント情報をMap型で格納する」
という記述が含まれています。何となく、そんな感じの記述に見えますね。

ポイントは、「userMap という property」と指定すると、DIコンテナ( SpringFramework )が、
自動的にそのインスタンスの「setUserMap」というメソッドをコールしてくれるのです。

このおかげで、LoginLogicMap.javaで、mUserMap が null で宣言されているので、実行時には
3人分のアカウント情報が入っているわけです。

LoginCtrl.javaの mLoginLogic を LoginLogicDummyからLoginLogicMapに変更

DIコンテナは、propertyのsetメソッドを自動的に呼び出してくれる訳です。
そこで、SpringWeb2-servlet.xmlに行った変更を見直してみます。

loginLogicというpropertyに対する操作なので、自動的に LoginCtrl.javaの setLoginLogic
という setter を呼び出す箇所であることが分かります。

では、セットする値はというと、bean="loginLogicMap"と記述しました。
これは、BaseBean.xmlで、LoginLogicMap クラスを登録したときの id です。

最後の仕上げです。LoginCtrl.javaのsetLoginLogicは引数の型は LoginLogicInterface型です
LoginLogicMapクラスは、、そうです、LoginLogicInterfaceを implements しています。
元々の LoginLogicDummyクラスも、LoginLogicInterfaceを implements しています。

DIコンテナを一言でいうと

設定ファイルで、setterの値を指定する」ということに尽きます。
setterじゃなくて、コンストラクタで設定する場合もありますが、主流はsetter方式です。