Внедрение конструктора с использованием параметра

У меня есть следующий компонент с параметризованным конструктором:

@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-компонент на основе параметра, который я передаю из службы.

После модификации: Приведенный выше пример работает нормально. Пожалуйста, предложите, если есть какие-либо проблемы в этой реализации...

где инъекция класса AuthHelper? Как класс может использовать конструктор?

Joonseo Lee 17.03.2022 01:29

я думаю, что конфигурация - это то, что вам нужно, вы можете автоматически настроить (внедрить) (опция) конфигурацию здесь.

Lei Yang 17.03.2022 01:32

Текущая логика работает нормально. Пожалуйста, предложите, если эта реализация не является хорошей или вызовет проблемы в любом месте. Будет ли он установлен глобально (для других пользователей, которые пытаются использовать Yahoo в параллели), пока я устанавливаю как authHelper.client("gmail").authLogic(uid, pass)?

Shakthi 17.03.2022 02:08

у меня есть два комментария 1. .client("gmail") обычно должен быть статическим методом (фабричный шаблон, client можно переименовать в of) 2. вам все еще нужно жестко закодировать строку типа, которая должна быть автоматически введена и получена из текущего http-контекст.

Lei Yang 17.03.2022 02:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 17.03.2022 22:05

@Shakthi Обновил ответ. Пожалуйста, посмотрите, поможет ли это.

Sup19 21.03.2022 06:56

Другие вопросы по теме