Jersey 2 - 请求范围绑定与单例绑定

Jersey 2 - Request scoped binding vs Singleton binding

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

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

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

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

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

PerLookup 意味着每次 查找 时都会创建一个新的服务实例,或者直接通过 ServiceLocator(或 InjectionManager 在 2.26+ 中)或通过 @Inject (或其他注入)注释。尽管这是默认范围,但 RequestScopeSingleton 范围更适合 Jersey 应用程序上下文中的大多数用例。

对于您想要从请求上下文中获取信息并在服务中使用它的用例,您可以使用 RequestScoped 服务并使用 bindFactory()Factory(或 2.26+ 中的 Supplier)并将请求上下文注入 Factory 并使用上下文创建您的服务。您可以在 How to inject an object into jersey request context?. If you are using Jersey 2.26+, you'll also want to read Jersey 2.26: register @Inject in ResourceConfig bindFactory cannot convert Factory to Supplier

中查看更多说明