我正在学习 Jersey
并尝试构建一个 rest api。但是我很难理解各种绑定(bind)之间的区别 - bind()
、AbstractBinder()
、bindFactory()
以及范围 - RequestScoped
、Singleton
和 PerLookup
。它们之间有什么区别以及何时使用哪一个?
例如假设我有一些特定于请求的数据传递到请求 header 中。我想在请求处理期间多次使用此数据(比如在资源类、DAO 等中)。我想到的是,我将使用 request filter
并使用 ContainerRequestContext
提取数据并将其存储到某个类中。但是我无法弄清楚如何绑定(bind)此类以便以后可以访问它。在这种情况下使用哪个绑定(bind)?
最佳答案
bind()
和 bindFactory()
是 AbstractBinder
类中的方法,用于在注册表中绑定(bind)您的服务。 AbstractBinder
是您向 Jersey 注册的内容,以便它知道配置您的所有绑定(bind)。您使用 bind()
来绑定(bind)服务本身。您使用 bindFactory()
绑定(bind)服务,使用 Factory
(或 2.26+ 中的 Supplier
)来创建服务。
RequestScoped
表示服务的范围限定为请求,这意味着在请求 的生命周期内它将是同一个实例。当服务依赖于与请求相关的信息(如请求 header )时,您将使用此范围。
Singleton
范围意味着在应用程序 的生命周期内只有一个服务实例。当可以随时安全地使用服务而不受任何请求约束时,您将使用此范围。
PerLookup
意味着每次查找时都会创建一个新的服务实例,直接通过 ServiceLocator
(或InjectionManager
在 2.26+ 中)或通过 @Inject
(或其他注入(inject))注解。尽管这是默认范围,RequestScope
和 Singleton
范围更适合 Jersey 应用程序上下文中的大多数用例。
对于您想要从请求上下文中获取信息并在服务中使用它的用例,您可以使用 RequestScoped
服务并使用 bindFactory()
使用 Factory
(或 2.26+ 中的 Supplier
)并将请求上下文注入(inject) 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
关于java - Jersey 2 - 请求范围绑定(bind)与单例绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49962686/