我有一个 Spring Rest 应用程序,其中需要在服务(带有注释的@Service
)类中获取一些访问令牌。令牌生成在一个单独的类中(用 注释@Component
),并且给出的要求是为每个新请求获取一个唯一的令牌。我将在服务类的同一个请求中使用生成的令牌两次。现在问题如下。
我可以使用@Autowired
. 并获取令牌,将其存储在类内的私有实例变量中,并在服务类中的任何我想要的地方使用它。只要请求有效,它是否是存储应该存在的值的正确方法。当我测试这种方法时,我发现单个请求的服务类中的方法打印了相同的访问令牌。这里会出什么问题?
我尝试的另一种方法是WebApplicationContext.SCOPE_REQUEST
在 TokenGenerator 类上使用,并在我的服务类中使用 Provider 来获取类实例,然后从中访问令牌。这也与以前的方法相同。如果是这样,为什么我什至需要使用请求范围值的方法?
方法一: 这里我使用了依赖注入来获取访问令牌。
@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 来获取访问令牌。并使用 Provider 获取服务类中的实例。
@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
}