【问题标题】:Jersey 2 - Request scoped binding vs Singleton bindingJersey 2 - 请求范围绑定与单例绑定
【发布时间】:2018-04-22 05:09:34
【问题描述】:

我正在学习 Jersey 并尝试构建一个 rest api。但是我很难理解各种绑定之间的区别 - bind()AbstractBinder()bindFactory() 以及范围 - RequestScopedSingletonPerLookup。它们之间有什么区别以及何时使用哪一个?

例如假设我有一些特定于请求的数据传递到请求标头中。我想在请求处理期间多次使用这些数据(比如在资源类、DAO 等中)。我想我将使用request filter 并使用ContainerRequestContext 提取数据并将其存储到某个类。但是我不知道如何绑定这个类,以便以后可以访问它。在这种情况下使用哪个绑定?

【问题讨论】:

    标签: java jax-rs jersey-2.0


    【解决方案1】:

    bind()bindFactory()AbstractBinder 类中的方法,用于在注册表中绑定服务。 AbstractBinder 是您在 Jersey 注册的,以便它知道配置您的所有绑定。您使用bind() 绑定服务本身。您使用bindFactory() 来绑定服务,使用Factory(或2.26+ 中的Supplier)来创建服务。

    RequestScoped 表示服务的范围仅限于请求,这意味着在请求 的生命周期内它将是同一个实例。当服务依赖于与请求相关的信息(如请求标头)时,您将使用此范围。

    Singleton 范围意味着在应用程序 的生命周期内只有一个服务实例。当服务可以随时安全地使用而不受任何请求的约束时,您将使用此范围。

    PerLookup 表示每次查找时都会创建一个新的服务实例,直接通过ServiceLocator(或2.26+ 中的InjectionManager)或通过@Inject(或其他注入)注解。即使这是默认范围,RequestScopeSingleton 范围也更适合 Jersey 应用程序上下文中的大多数用例。

    对于您想要从请求上下文获取信息并在服务中使用它的用例,您可以使用 RequestScoped 服务并使用 bindFactory()Factory(或 2.26 中的 Supplier +) 并将请求上下文注入Factory 并使用上下文创建您的服务。您可以在How to inject an object into jersey request context? 中看到更多解释。如果您使用 Jersey 2.26+,您还需要阅读 Jersey 2.26: register @Inject in ResourceConfig bindFactory cannot convert Factory to Supplier

    【讨论】:

    • 非常感谢您的解释
    猜你喜欢
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2014-03-20
    • 2016-10-14
    相关资源
    最近更新 更多