【问题标题】:What's the benefit of having Jersey instantiating components拥有 Jersey 实例化组件有什么好处
【发布时间】:2016-02-22 14:35:00
【问题描述】:

我见过的所有 Spring Boot 和 Jersey 的代码示例都通过传递组件的类向 Jersey 注册它们的组件。

来自here

  public static class JerseyServletConfig extends ResourceConfig {
    public JerseyServletConfig() {
      register(RequestContextFilter.class);
      packages("com.github.cthiebault");
      register(LoggingFilter.class);
    }
  }

here:

register(ApiListingResource.class);

ResourceConfig's javadoc says:

注册一个自定义 JAX-RS 组件的实例(例如 扩展提供程序或功能元提供程序)被实例化和 在此可配置上下文的范围内使用。

我的问题是:

  1. 让 Jersey 实例化这些资源有什么好处?

  2. 如果我们应该让 Jersey 管理这些组件,为什么它仍然提供 register(Object component) 方法,为什么不将其限制为 register(Class<?> componentClass)

  3. 我们什么时候应该发送我们自己的实例,而不是让 Jersey 实例化我们的类?

【问题讨论】:

    标签: java spring-boot jersey jax-rs jersey-2.0


    【解决方案1】:

    首先,依赖注入通常是一件好事(tm) - 它允许分离关注点并且可以大大简化测试。一般来说,将对象创建与对象使用分开会带来好处,将业务/应用程序逻辑(即对象使用)与实现问题(决定哪些对象连接在一起)分开。

    允许 Jersey 管理您的资源/组件也是一件好事。这是泽西岛的一部分。如果您允许 Jersey 管理您的资源生命周期,那么您编写/维护的代码就会减少,而您执行最终编写/维护的代码更多地与您的应用程序执行有关更不用说你的对象如何组合在一起了。

    Jersey 提供了一个标准生命周期,它为您提供了一个约定,允许开发人员在其中工作的思维框架 - 使新开发人员更容易加入,现有开发人员可以更轻松地在应用程序之间切换。如果需要,可以配置生命周期,这允许您的特殊雪花应用程序在必要时具有特殊雪花行为。

    register(Object) 方法是一个示例,说明如何选择退出 Jersey 来控制组件的生命周期。您可能出于很多原因想要这样做,但您通常应该避免这样做 - 让图书馆完成它的工作。例外情况的示例是,如果您正在与一些遗留代码集成,由于其本身晦涩/神秘的原因,这意味着某些关键类必须是应用程序级的单例。甚至可能有一些非传统原因导致您在应用程序中只需要某个事物的单个实例 - 对象映射器始终是一个很好的例子。通常,您现在会为此使用 JSR-330 支持,但可能在某些情况下这是不可能的。

    通过与 JSR-330 集成,您还可以为某些对象提供自定义命名范围 - 这允许您控制 Jersey 创建和使用对象的方式,同时还可以显示您的意图(通过范围名称)。这通常提供了一个清晰的结构,它是意图揭示而不是意图隐藏。

    【讨论】:

      猜你喜欢
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      相关资源
      最近更新 更多