2016-07-22 5 views
0

Я есть путаница о том, как идти о с выше сценария весной (зависимость контекстную инъекции)Spring Dependency Injection Сценарий

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

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

} 

UserAuthService является интерфейс, который имеет логическое метод Validate (String имя пользователя, String пароль);

Он реализуется службой BasicAuthService, LDAPAuthService, MockBasicAuthService, MockLDAPAuthService; Также предположим, что BasicAuthServie имеет свойство serverAddress, как строку, которая имеет IP-адрес сервера аутентификации, , то же самое с LDAPAuthService.

контекст моего вопроса является Dependency Injection и Spring,

я понял, что на основе beanconfig файла Spring ('ы МОК) будет впрыснуть один из конкретной реализации UserAuthService.

1. В файле beanconfig мы можем настроить только один ref say() Сценарий: предположим, что в пользовательском интерфейсе пользователь имеет выпадающий список, чтобы выбрать BasicAuth/LDAPAuth. Пользователь выбрал LDAPAuth, как справиться с этим случаем весной? , так как у нас есть hardwired ref = "beanIdBasicAuthService" в файле beanconfig). Есть ли способ динамического изменения ref?

2. Еще немного сложнее (предположим, что ИТ-администратор или так), пользовательский интерфейс теперь предоставляет возможность выбора адреса сервера аутентификации (который является свойством в классе службы аутентификации Basic/LDAP) Снова в файле beanconfig мы бы установили свойства. Как динамически менять его весной? (за исключением явного получения инжектируемого компонента и вызова 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

Весна предлагает немного белой магии, но вам действительно нужна черная магия здесь :-).

Более серьезно, вы правы с одной стороны: весна может настраивать фасоль в момент создания бобов и только если она создает фасоль. Кстати, есть также вопрос о сфере применения: компонент Singleton будет создан только один раз, и один и тот же объект будет использоваться во всем приложении, тогда как с областью бобов новый объект будет создан, когда он запрашивается из контекста приложения.

Но, если у вас есть компонент, вы можете использовать его и изменять значения, которые были инициализированы весной.

Это просто путь к второму вопросу: вводите AuthService (ы) в пользовательский интерфейс и просто меняйте адрес сервера через пользовательский интерфейс (с небольшим количеством синхронизации ...): новый адрес будет используется с этого момента.

Для первого вопроса я бы сказал, что необычно вводить службу проверки подлинности в класс, подобный классу Login. Сначала это заставляет вас создать любой объект Login через запрос к контексту приложения, который излишне связывает ваше приложение с классами Spring. ИМХО лучше разработать, чтобы иметь мастер-класс аутентификации, инъецированный контейнером конкретных объектов аутентификации, и делегирование им фактической аутентификации.Это то, что Spring Security делает с AuthenticationManager, который делегирует фактическую аутентификацию AuthenticationProviders.