gpt4 book ai didi

java - Java Rest 服务范围内的静态变量

转载 作者:行者123 更新时间:2023-11-30 06:19:58 26 4
gpt4 key购买 nike

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

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

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

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

一旦另一个用户调用 getData 休息服务,相同的函数 getSingletonData 将再次返回 1 和 2,而不是 3 和 4(如果内部整型变量将被定义为静态?)。

我知道我可以将变量定义为 REST 服务内的局部变量,但我想避免将其作为参数传递给许多函数,并且我希望该类成为单例(该类仅返回顺序在特定 REST 调用的范围内询问时的数字)。

最佳答案

嗯,解决问题的一种方法是定义基于请求的 bean。你看,Spring组件可能有不同的scopes : 例如单例、原型(prototype)、请求和 session 。

因此,您可以定义一个 bean,其作用域是“请求”本身。通过这样做,您将获得每个请求注入(inject)的新实例,例如你的 Controller 。

您可以按如下方式定义这样的数据提供者:

@Configuration
public class DataProviderConfiguration {

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

}

然后在您的 Controller 中,您将获得使用经典注入(inject)的每个请求注入(inject)的实例。

@RestController
public class DataProviderController {

@Autowired
private Supplier<Integer> requestDataProvider;

@GetMapping("/answers")
public Integer[] getAnswer() {
return new Integer[]{requestDataProvider.get(), requestDataProvider.get()};
}

}

这将一致地为每个请求生成结果 [1,2],这似乎就是您想要实现的。

关于java - Java Rest 服务范围内的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48366051/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com