让 Jersey 实例化组件有什么好处

What's the benefit of having Jersey instantiating components

我见过的 Spring Boot 和 Jersey 的所有代码示例通过传递组件的 class.

向 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:

Register an instance of a custom JAX-RS component (such as an extension provider or a feature meta-provider) to be instantiated and used in the scope of this configurable context.

我的问题是:

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

  2. 如果让Jersey管理那些组件,为什么它还提供register(Object component)方法,为什么不限制在register(Class<?> componentClass)

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

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

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

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

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

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