【问题标题】:Using Jersey with Spring Boot将 Jersey 与 Spring Boot 一起使用
【发布时间】:2021-01-02 13:28:47
【问题描述】:

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

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

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

【问题讨论】:

  • 这是同一主题的another question
  • “由于 Endpoint 是 Spring @Component,它的生命周期由 Spring 管理” - 不同之处在于它不是由 Spring 管理的。那是误导还是不直截了当呢?如果它不是由 Spring 管理的,那么它必须由 Jersey 管理。这就是区别。
  • “所有注册的端点都应该是@Components”。假设您想要将 Spring 功能与 Jersey 结合使用。在这句话之后,它直接解释了作为 Spring 组件(使用 @Component 注释)得到的内容。我看不出有什么好大惊小怪的。
  • 如果它让您感到困扰,您可以随时打开一个问题,他们会与您讨论他们的想法。
  • @PaulSamsotha。谢谢。您的 cmets 确实为我明确了这个概念。我会把这个问题留几天,以防其他人有什么要补充的。如果没有其他 cmets 或答案,我将删除我的问题。再次感谢。

标签: spring-boot jersey spring-jersey


【解决方案1】:

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

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

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

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

因此存在差异。默认情况下,普通 Jersey 根资源类是按请求实例化的,而在 Spring 中,当使用 @Component 注释资源时,它将是单例的。即在JVM 的生命周期中只有一个实例。如果您希望 Spring 托管资源具有与普通 Jersey 资源相同的每个请求生命周期,那么您应该在 @Component 注释之外添加 Spring @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST) 注释。通过添加它,您的资源生命周期现在将按请求进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-17
    • 2020-03-09
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 2015-11-03
    • 2016-12-27
    • 2017-03-21
    相关资源
    最近更新 更多