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

3
我正在学习Jersey并尝试构建一个rest api。但我很难理解各种绑定之间的区别- bind(),AbstractBinder(),bindFactory()以及作用域- RequestScoped,Singleton和PerLookup。它们之间的区别是什么?在何时使用哪个?
例如,假设我有一些请求特定数据传递到请求标头中。我希望在请求处理期间多次使用此数据(例如在资源类、DAO等中)。我想到可以使用请求过滤器,并使用ContainerRequestContext提取数据并将其存储到某个类中。但我无法弄清楚如何绑定此类以便稍后访问。在这种情况下应该使用哪种绑定?
1个回答

4

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

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

Singleton作用域意味着在应用程序的整个生命周期中只会有一个服务实例。当服务可以安全地在任何时候使用而不被绑定到任何请求时,应使用此范围。

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

对于您想要从请求上下文中获取信息并在服务中使用它的用例,您将使用RequestScoped服务,并使用bindFactory()Factory(或2.26+中的Supplier),并将请求上下文注入Factory,并使用上下文创建服务。您可以在如何将对象注入Jersey请求上下文?看到更多解释。如果您使用的是Jersey 2.26+,您还需要阅读Jersey 2.26:在ResourceConfig bindFactory中注册@Inject无法将Factory转换为Supplier


非常感谢您的解释。 - DrunkOnBytes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接