Jersey 2 - 请求范围绑定与单例绑定
Jersey 2 - Request scoped binding vs Singleton binding
我正在学习 Jersey
并努力休息 api。但我很难理解各种绑定之间的区别 - bind()
、 AbstractBinder()
、bindFactory()
以及范围 - RequestScoped
、 Singleton
和 PerLookup
。它们之间有什么区别以及何时使用哪一个?
例如假设我有一些特定于请求的数据传递到请求 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
(或其他注入)注释。尽管这是默认范围,但 RequestScope
和 Singleton
范围更适合 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
中查看更多说明
我正在学习 Jersey
并努力休息 api。但我很难理解各种绑定之间的区别 - bind()
、 AbstractBinder()
、bindFactory()
以及范围 - RequestScoped
、 Singleton
和 PerLookup
。它们之间有什么区别以及何时使用哪一个?
例如假设我有一些特定于请求的数据传递到请求 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
(或其他注入)注释。尽管这是默认范围,但 RequestScope
和 Singleton
范围更适合 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