Jersey 2 - 请求范围绑定与Singleton绑定

时间:2018-04-22 05:09:34

标签: java jax-rs jersey-2.0

我正在学习Jersey并试图建立一个休息api。但是我很难理解各种绑定之间的区别 - bind()AbstractBinder()bindFactory()以及范围 - RequestScopedSingleton和{ {1}}。他们和何时使用哪一个有什么区别?

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

对于您希望从请求上下文中获取信息并在服务中使用它的用例,您将使用RequestScoped服务并使用bindFactory() Factory({1}}或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