将 Jersey 与 Spring 引导一起使用

Using Jersey with Spring Boot

标题为 7.3 JAX-RS and Jersey 的部分中的 Spring 引导参考文档提到“所有 已注册的端点都应该是具有 HTTP 资源的 @Components注解(@GET 等)。由于 Endpoint 是一个 Spring @Component,它的生命周期由 Spring 管理,你可以使用 @Autowired 注解注入依赖,使用 @Value 注解注入外部配置".

但我不关心将依赖项注入或将外部配置注入到我的 Jersey 资源中,因此我没有将我的 Jersey 资源注释为 @Components。我的应用运行正常。

阅读 Spring 引导参考文档后,似乎需要将 Jersey 资源注册为 @Components。但事实似乎并非如此。对我来说,这似乎是 Spring 引导参考文档中的一个小错误。可能文档可以从“registered endpoints should be @Components”更新为“registered endpoints ”可以 是@Components”。这有意义吗?

我确实试过了,发现用 Spring @Component 注释注释 Jersey 资源是可选的。如果您使用该注释,则资源的 life-cycle 将由 Spring 管理,如果您不使用该注释,则 life-cycle 将由 Jersey 管理。

需要注意的一件重要事情是,两者之间 life-cycle 的默认编程方式存在重大差异。

section 3.4 of the Jersey User Guide所述“默认情况下,根资源classes的life-cycle是per-request,即每次请求 URI 路径与根资源匹配时都会创建一个根资源 class。这形成了一个非常自然的编程模型,在该模型中可以使用构造函数和字段,而无需担心对同一资源的多个并发请求。一般来说,这不太可能是性能问题的原因。Class JVM 的构造和垃圾收集多年来得到了极大的改进,许多对象将被创建和丢弃以服务和处理 HTTP 请求和 return HTTP响应。"

但如 Spring Framework Documentation section 1.5 所述;默认情况下,bean 是单例的。 “Spring IoC 容器恰好创建该 bean 定义定义的对象的一个​​实例。这个单个实例存储在此类单例 bean 的缓存中,以及对该命名 bean 的所有后续请求和引用 return 缓存的对象。"

所以有区别。默认情况下,普通 Jersey 根资源 classes 被实例化 per-request,而使用 Spring 当资源被 @Component 注释时,它将是单例的。即在 JVM 的生命周期内只有一个实例。如果您希望 Spring 托管资源具有与普通 Jersey 资源相同的 per-request life-cycle,那么您应该添加 Spring @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST) 除了@组件注解。通过添加它,您的资源 life-cycle 现在将是 per-request.