У меня есть приложение 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
}