我有一个用@RestController
注释定义的APIController类,它包含几个REST服务,使用@RequestMapping
注释定义。
我正在寻找一种方法来定义一个“静态”整数,它将在每次REST调用时初始化为0。
我的目标是定义一个具有REST实例/调用范围的单例,而不是整个应用程序的范围。
例如:我有一个getData
REST,它调用内部函数getSingletonData
两次。第一次调用getSingletonData
将返回1,第二次调用将返回2.
一旦另一个用户调用getData
休息服务,相同的函数getSingletonData
将再次返回1和2,而不是3和4(如果将定义内部整数变量,将会发生这种情况作为静态?)。
我知道我可以将变量定义为REST服务中的局部变量,但我想避免将其作为参数传递给许多函数,我希望该类成为一个单例(该类只返回顺序每当被问到时,在特定REST调用的范围内)。
答案 0 :(得分:1)
嗯,解决问题的一种方法是定义一个基于请求的bean。你看,Spring组件可能有不同的scopes:例如单身,原型,请求和会话。
因此,您可以定义一个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]
,这似乎是您想要实现的目标。