Java休息服务范围内的静态变量

时间:2018-01-21 10:57:43

标签: java spring rest spring-mvc

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

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

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

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

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

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

1 个答案:

答案 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],这似乎是您想要实现的目标。