У меня есть следующий компонент с параметризованным конструктором:
@Component
public class AuthHelper{
@Autowired
private AuthClient gmailClient;
@Autowired
private AuthClient yahooClient;
private AuthClient client;
public AuthHelper client(String option) {
if (option.equals("gmail")) this.client=gmailClient;
if (option.equals("yahoo")) this.client=yahooClient;
return this;
}
public boolean authLogic(String uid, String pass) {
return client.authorize(uid,pass);
}
}
Не могли бы вы помочь с автосвязыванием вышеуказанного bean-компонента:
Я застрял, пока вызываю вышеуказанный компонент в сервисе ниже,
@Service
public class AuthService{
@Autowired
public AuthHelper authHelper;
public boolean authenticate(String uid, String pass){
return authHelper.client("gmail").authLogic(uid, pass);
}
}
Пожалуйста, предложите... Я хочу, чтобы вспомогательный класс использовал bean-компонент на основе параметра, который я передаю из службы.
После модификации: Приведенный выше пример работает нормально. Пожалуйста, предложите, если есть какие-либо проблемы в этой реализации...
я думаю, что конфигурация - это то, что вам нужно, вы можете автоматически настроить (внедрить) (опция) конфигурацию здесь.
Текущая логика работает нормально. Пожалуйста, предложите, если эта реализация не является хорошей или вызовет проблемы в любом месте. Будет ли он установлен глобально (для других пользователей, которые пытаются использовать Yahoo в параллели), пока я устанавливаю как authHelper.client("gmail").authLogic(uid, pass)
?
у меня есть два комментария 1. .client("gmail") обычно должен быть статическим методом (фабричный шаблон, client
можно переименовать в of
) 2. вам все еще нужно жестко закодировать строку типа, которая должна быть автоматически введена и получена из текущего http-контекст.
IMO, лучшим подходом было бы иметь AuthHelperFactory, который должен предоставить компоненту AuthHelper соответствующий клиент в соответствии с вводом.
public class AuthHelper{
private AuthClient client;
public AuthHelper (AuthClient client) {
this.client = client;
}
public boolean authLogic(String uid, String pass) {
return this.client.authorize(uid,pass);
}
}
@Component
public class AuthHelperFactory {
@Autowired
private AuthClient gmailClient;
@Autowired
private AuthClient yahooClient;
public AuthHelper getAuthHelper(String option) {
if (option.equals("gmail")){
return new AuthHelper(gmailClient);
} else if (option.equals("yahoo")){
return new AuthHelper(yahooClient);
}
}
}
В AuthService вам нужно вызвать фабричный метод в методе аутентификации.
return authHelperFactory.getAuthHelper("gmail").authLogic(uid, pass);
Не могли бы вы дать образец фрагмента?
@Shakthi Обновил ответ. Пожалуйста, посмотрите, поможет ли это.
где инъекция класса AuthHelper? Как класс может использовать конструктор?