2016-07-22 24 views
0

Ich habe bin eine Verwirrung darüber, wie mit obigem Szenario in Spring (Dependency Injection Kontext)Frühling Dependency Injection Szenario

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

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

} 

UserAuthService ist eine Schnittstelle, die eine Boolesche Methode Validate muss gehen über (String username, String password);

Es wird von BasicAuthService, LDAPAuthService, MockBasicAuthService, MockLDAPAuthService implementiert; Auch angenommen, dass BasicAuthServie eine Eigenschaft serverAddress hat, als Zeichenfolge, die die IP-Adresse des Authentifizierungsservers hat, gleich mit LDAPAuthService.

Kontext meiner Frage ist Dependency Injection und Frühling,

ich verstanden, dass basierend auf beanconfig Datei Spring ('s IOC) wird eines der konkreten Umsetzung von UserAuthService injizieren.

1. In der Beanconfig-Datei können wir nur einen Verweis konfigurieren say() Szenario: Angenommen, Benutzer in UI haben ein Dropdown-Menü, um BasicAuth/LDAPAuth auszuwählen. Benutzer haben LDAPAuth ausgewählt, wie Sie mit diesem Fall im Frühjahr umgehen? , da wir ref = "beanIdBasicAuthService" in der Beanconfig-Datei fest verdrahtet haben. Gibt es eine Möglichkeit, den Ref dynamisch zu ändern?

2. Etwas komplizierter (annehmen Sie IT-Administrator oder so), UI bietet jetzt Option zum Auswählen der Adresse des Authentifizierungsservers (was eine Eigenschaft in der Basic/LDAP Auth Service Class ist) Wieder in Beanconfig-Datei hätten wir die Eigenschaften fest verdrahtet. Wie kann man es im Frühling dynamisch verändern? (Anders als explizit die injizierte Bean zu erhalten und setterMethod aufzurufen)

Diese Szenarien sind ein bisschen verwirrend für mich. Kann mir bitte jemand das erklären?

Antwort

0

Antwort auf beide Fragen: injizieren Sie stattdessen eine Fabrikklasse. Zum Beispiel in Ihrem Beispiel:

0

Frühling bietet etwas weiße Magie, aber Sie benötigen wirklich schwarze Magie hier :-).

Ernsthafter, Sie sind direkt an einem Teil: Spring kann nur eine Bohne zur Bean Erstellungszeit konfigurieren und nur, wenn es die Bohne erstellt. Übrigens gibt es auch die Frage nach dem Geltungsbereich: Eine Singleton-Bean wird nur einmal erstellt, und dasselbe Objekt wird in der gesamten Anwendung verwendet, während mit Bean-Geltungsbereich ein neues Objekt erstellt wird, wenn es vom Anwendungskontext angefordert wird.

Sobald Sie jedoch eine Bean haben, können Sie sie verwenden und Werte ändern, die von Spring initialisiert wurden.

Das ist einfach der Weg für die zweite Frage: inject AuthService (s) in der UI, und ändern Sie einfach die Server-Adresse über die Benutzeroberfläche (mit ein wenig Synchronisation ...): Die neue Adresse wird sein von diesem Moment an benutzt.

Für die erste Frage würde ich zuerst sagen, dass es ungewöhnlich ist, einen Authentifizierungsdienst in eine Klasse wie Ihre Login Klasse zu injizieren. Zuerst zwingt es Sie, ein Objekt Login durch eine Anfrage an den Anwendungskontext zu erstellen, der Ihre Anwendung unnötigerweise an Spring-Klassen bindet. IMHO wäre ein besseres Design, eine Masterauthentifizierungsklasse mit einem Container konkreter Authentifizierungsobjekte zu injizieren und die tatsächliche Authentifizierung an sie zu delegieren.Genau dies macht Spring Security mit einem AuthenticationManager, der die eigentliche Authentifizierung an AuthenticationProvider delegiert.