0

Spring Boot Reference Documentation 在标题为7.3 JAX-RS 和 Jersey的部分中提到“所有注册的端点都应该是带有 HTTP 资源注释(@GET 和其他)的@Components。由于端点是 Spring @Component,它的生命周期由 Spring 管理并且您可以使用@Autowired 注解注入依赖项并使用@Value 注解注入外部配置”。

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

通过阅读 Spring Boot 参考文档,似乎需要将 Jersey 资源注册为 @Components。但情况似乎并非如此。对我来说,这似乎是 Spring Boot 参考文档中的一个小错误。可能是文档可以从“注册端点应该是@Components ”更新为“注册端点可以是@Components ”。这有意义吗?

4

1 回答 1

0

我确实尝试过,发现使用 Spring @Component 注释对 Jersey 资源进行注释是可选的。如果您使用该注释,则资源的生命周期将由 Spring 管理,如果您不使用该注释,则生命周期将由 Jersey 管理。

需要注意的一件重要事情是,在默认情况下,生命周期的编程方式在两者之间存在重大差异。

正如泽西用户指南第 3.4 节所述“默认情况下,根资源类的生命周期是按请求进行的,即每次请求 URI 路径与根资源匹配时都会创建一个根资源类的新实例。这形成了一个非常自然的编程模型,可以使用构造函数和字段,而不用担心对同一资源的多个并发请求。一般来说,这不太可能是性能问题的原因。JVM 的类构建和垃圾收集已经大大改进年和许多对象将被创建和丢弃,以服务和处理 HTTP 请求并返回 HTTP 响应。

但如Spring Framework 文档 第 1.5 节所述;默认情况下,bean 是单例的。“ Spring IoC 容器只创建由该 bean 定义定义的对象的一个​​实例。这个单个实例存储在此类单例 bean 的缓存中,并且该命名 bean 的所有后续请求和引用都返回缓存的对象。

Hence there is a difference. Normal Jersey root resource classes by default are instantiated per-request, while with Spring when a resource is annotated with @Component it will be singleton. ie only one instance for the lifetime of the JVM. If you want Spring managed resources to have the same per-request life-cycle that comes with normal Jersey resources then you should add the Spring @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST) annotation in addition to the @Component annotation. By adding it your resource life-cycle will now be per-request.

于 2020-09-17T04:29:22.883 回答