2016-07-22 7 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 속성이 있다고 가정합니다. 내 질문의

컨텍스트

나는 UserAuthService의 구체적인 구현 중 하나를 주입 것 beanconfig 파일을 기반으로 봄 (의 IOC)를 이해 의존성 삽입 (Dependency Injection)과 봄입니다.

1. beanconfig 파일에서 우리는 ref를 한 번만 구성 할 수 있습니다.() 시나리오 : UI 사용자가 BasicAuth/LDAPAuth를 선택하기위한 드롭 다운을 가지고 있다고 가정합니다. 사용자가 LDAPAuth를 선택했습니다. 봄에이 사례를 처리하는 방법은 무엇입니까? beanconfig 파일에 ref = "beanIdBasicAuthService"가 고정되어 있기 때문에). 동적으로 심판을 변경하는 방법이 있습니까?

2. 좀 더 복잡한 (IT 관리자 또는 가정), UI는 이제 인증 서버의 주소 (Basic/LDAP Auth Service 클래스의 속성)를 선택하는 옵션을 제공합니다. 다시 beanconfig 파일에서 우리는 속성을 하드 와이어 시켰을 것입니다. 봄에 다이나믹하게 변화시키는 방법? (주입 된 bean을 명시 적으로 얻지 않고 setterMethod를 호출하는 것 외)

이 시나리오는 다소 혼란 스럽다. 누군가 설명해 주시겠습니까?

답변

0

두 가지 질문에 답하십시오. 대신 팩토리 클래스를 삽입하십시오. 예. 귀하의 예 :

class Login { 
    String username; 
    String password; 
    UserAuthServiceFactory userAuthFactory; 

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

class UserAuthServiceFactory { 
    UserAuthService createUserAuth(String type, String remoteHost, ...) {...} 
} 
0

봄은 약간의 백색 마술을 제공하지만 실제로는 여기에 검은 색 마술이 필요합니다.

좀더 진지하게 말하자면, Spring은 빈 생성 시간이 일 때 빈을 구성 할 수 있고, 빈을 생성하는 경우에만 빈을 생성 할 수 있습니다. BTW에서는 범위에 대한 질문도 있습니다. Singleton 빈은 한 번만 생성되며 응용 프로그램 전체에서 동일한 객체가 사용되는 반면 Bean 범위에서는 응용 프로그램 컨텍스트에서 요청 될 때 새 객체가 생성됩니다.

하지만 일단 bean이 있으면 자유롭게 사용하고 Spring에 의해 초기화 된 값을 변경할 수 있습니다.

간단히 말해서 두 번째 질문은 UI에 AuthService를 삽입하고 UI를 통해 서버 주소를 변경하는 것입니다. (약간의 동기화를 통해 ...) : 새 주소는 그 순간부터 사용되었습니다.

첫 번째 질문에 대해서는 먼저 Login 클래스와 같은 클래스에 인증 서비스를 삽입하는 것이 일반적이라고합니다. 먼저, 응용 프로그램 컨텍스트에 대한 요청을 통해 Login 객체를 강제로 생성하여 응용 프로그램을 불필요하게 Spring 클래스에 연결합니다. IMHO 더 나은 디자인은 구체적인 인증 객체의 컨테이너로 주입 된 마스터 인증 클래스를 가지며 실제 인증을 위임하는 것입니다.Spring Security가 AuthenticationProviders에 실제 인증을 위임하는 AuthenticationManager로 수행하는 작업입니다.