2016-07-22 8 views
0

私は春(依存性注入コンテキスト)に上記のシナリオに取り掛かる方法についての混乱を持っています春の依存性注入のシナリオ

class Login { 
    String username; 
    String password; 
    UserAuthService userAuth; 

    /* 
     assume getter and setter 
     methods for above private 
     properties here 
    */ 

} 

UserAuthServiceは、ブール法の検証(文字列名、文字列のパスワードを持っているインターフェースであります);

BasicAuthService、LDAPAuthService、MockBasicAuthService、MockLDAPAuthServiceで実装されています。 また、BasicAuthServieには、LDAPAuthServiceと同じ という認証サーバーのIPアドレスを持つ文字列として、serverAddressプロパティがあるとします。私の質問の

コンテキスト依存性の注入と春、

である私はbeanconfigファイルの春(のIOC)に基づいていることを理解 UserAuthServiceの具体的な実装のいずれかを注入します。

1。 beanconfigファイルでは、refを1つしか設定できません。 シナリオ:UIユーザーに、BasicAuth/LDAPAuthを選択するドロップダウンがあるとします。ユーザーはLDAPAuthを選択しました。春にこのケースに対処する方法は? beanconfigファイルのref = "beanIdBasicAuthService"がハードワイヤードされているためです)。動力学的にリファレンスを変更する方法はありますか?

2。少し複雑(IT管理者など)、UIは認証サーバー(Basic/LDAP Authサービスクラスのプロパティ)のアドレスを選択するオプションを提供しています もう一度beanconfigファイルでプロパティをハードワイヤードにしていました。ダイナミックに春にそれを変える方法は? (注入されたBeanを明示的に取得してsetterMethodを呼び出す以外)

これらのシナリオは私にとってはちょっと混乱します。誰かがこれを説明できますか?

答えて

0

両方の質問に答えてください:代わりにファクトリクラスを挿入してください。 など。あなたの例では:

0

春にはいくつかの白い魔法がありますが、あなたは本当にここで黒い魔法を要求しています:-)。

もっと重要なのは、あなたが正しいことです。SpringはBeanの作成時に、Beanの作成時にと、というBeanを作成する場合にのみBeanを構成できます。ところで、スコープの問題もあります。シングルトンBeanは1回だけ作成され、同じオブジェクトがアプリケーション全体で使用されますが、Beanスコープでは、アプリケーションコンテキストから要求されたときに新しいオブジェクトが作成されます。

しかし、いったんBeanを使用したら、それを使用してSpringで初期化された値を自由に変更できます。

これは、UIにAuthServiceを挿入し、UIを使用してサーバーアドレスを変更するだけです(同期を少し...):新しいアドレスは次のようになりますその時から使用されています。

最初の質問では、まずLoginクラスのようなクラスに認証サービスを注入することは珍しいことです。最初に、アプリケーションコンテキストへのリクエストにより、アプリケーションをSpringクラスに不必要に結びつけることによって、Loginオブジェクトを作成するように強制します。より良い設計は、具体的な認証オブジェクトのコンテナでマスター認証クラスを注入し、実際の認証を委譲することです。これは、実際の認証をAuthenticationProvidersに委譲するAuthenticationManagerでSpring Securityが行うことです。