Java rest 服务范围内的静态变量



我有一个用@RestController注解定义的APIController类,它包含多个REST服务,用@RequestMapping注解定义。

我正在寻找一种方法来定义一个"静态"整数,该整数将在每次 REST 调用时初始化为 0。

我的目标是定义一个具有 REST 实例/调用范围的单例,而不是整个应用程序的作用域。

例如:我有一个getDataREST,它调用内部函数getSingletonData两次。对getSingletonData的第一次调用将返回 1,第二次调用将返回 2。

一旦另一个用户调用getDatarest 服务,相同的函数getSingletonData将再次返回 1 和 2,而不是 3 和 4(如果内部整数变量被定义为静态,就会发生这种情况?

我知道我可以在 REST 服务中将变量定义为局部变量,但我想避免将其作为参数传递给许多函数,并且我希望该类是单例(该类只是在那个特定的 REST 调用范围内,每当被问到时返回序列号)。

好吧,解决问题的一种方法是定义一个基于请求的 bean。你看,Spring 组件可能有不同的作用域:例如单例、原型、请求和会话。

因此,您可以定义一个 bean,其范围是"请求"本身。通过这样做,您将获得每个请求注入的新实例,例如您的控制器。

您可以按如下方式定义此类数据提供程序:

@Configuration
public class DataProviderConfiguration {
@Bean
@Scope(scopeName = WebApplicationContext.SCOPE_REQUEST,
proxyMode = ScopedProxyMode.INTERFACES)
public Supplier<Integer> getRequestDataProvider() {
AtomicInteger value = new AtomicInteger();
return value::incrementAndGet;
}
}

然后在您的控制器中,您将使用经典注入为每个请求注入一个实例。

@RestController
public class DataProviderController {
@Autowired
private Supplier<Integer> requestDataProvider;
@GetMapping("/answers")
public Integer[] getAnswer() {
return new Integer[]{requestDataProvider.get(), requestDataProvider.get()};
}
}

这将始终如一地产生每个请求[1,2]的结果,这似乎是您想要实现的。

最新更新