Внедрение зависимости от объема запроса - PullRequest
1 голос
/ 14 февраля 2020

У меня есть приложение Spring Rest, в котором есть требование получить некоторый токен доступа в классе службы (аннотирован @Service). Генерация токена находится в отдельном классе (аннотирован @Component), и данное требование состоит в том, чтобы получить уникальный токен для каждого нового запроса. И я буду использовать сгенерированный токен два раза в рамках одного и того же запроса в классе обслуживания. Теперь вопросы следующие:

Я могу добавить класс tokenGenerator, используя @Autowired. И получите токен, сохраните его в закрытой переменной экземпляра внутри класса и используйте в любом месте внутри класса обслуживания. Правильный ли подход для хранения значения, которое должно жить, пока активен запрос. Когда я протестировал этот подход, я обнаружил, что один и тот же токен распечатывается в методах класса обслуживания для одного запроса. что бы go здесь не так?

Еще один подход, который я пробовал, заключался в использовании WebApplicationContext.SCOPE_REQUEST в классе TokenGenerator и использовании провайдера в моем классе обслуживания, чтобы получить экземпляр класса и затем получить доступ к токену из него. Это также работает так же, как и предыдущий подход. Если да, то почему мне даже нужно использовать подход для значений области запроса?

Подход 1: Здесь я использовал внедрение зависимостей для получения токена доступа.

@Component
public class TokenGenerator
{
 public string getToken();//okhttp Rest API Call
}

@Service
public class ServiceClass{
    @Autowired 
    TokenGenetor token;

    private String tokenValue;//**setTokenValue as setter**

    public void method1()
    {
     setTokenValue(token.getToken());
    }
    public method2(){print(tokenValue)}// prints 1234abcd
    public method3(){print(tokenValue)}// prints 1234abcd
}

Подход 2: Здесь я использовал RequestScope для получения токена доступа. и использовал поставщик, чтобы получить экземпляр в классе обслуживания.

@Component
@scope(WebApplicationContext=scope_request)
public class TokenGenerator
{
    public string getToken();//okhttp Rest API Call
}

@Service
public class ServiceClass{
    @Autowired 
    private Provider<TokenGenetor> token;

    private String tokenValue;//setTokenValue as setter

    public void method1()
    {
     // Not Setting anything
    }
    public method2(){print(token.get().getToken();)}// prints 1234abcd
    public method3(){print(token.get().getToken();)}// prints 1234abcd
}
...