我正在学习Jersey
并试图建立一个休息api。但是我很难理解各种绑定之间的区别 - bind()
,AbstractBinder()
,bindFactory()
以及范围 - RequestScoped
,Singleton
和{ {1}}。他们和何时使用哪一个有什么区别?
e.g。假设我有一些请求特定数据传递到请求标头。我想在请求处理期间多次使用此数据(例如在资源类,DAO等中)。我想的是我将使用PerLookup
并使用request filter
提取数据并将其存储到某个类。但我无法弄清楚如何绑定这个类,以便我以后可以访问它。在这种情况下使用哪种绑定?
答案 0 :(得分:1)
bind()
和bindFactory()
是AbstractBinder
类中用于绑定注册表中服务的方法。 AbstractBinder
是您在Jersey注册的内容,因此它知道配置所有绑定。您使用bind()
绑定服务本身。您使用bindFactory()
使用Factory
(或2.26+中的Supplier
)绑定服务以创建服务。
RequestScoped
表示服务范围限定为请求,这意味着它将是请求生命周期内的同一实例。当服务依赖于与请求关联的信息(如请求标头)时,您将使用此范围。
Singleton
范围意味着应用程序的生命周期中只有一个服务实例。当服务可以随时安全地使用而不受任何请求的束缚时,您可以使用此范围。
PerLookup
表示每次查找时都会创建一个新的服务实例,直接通过ServiceLocator
(或InjectionManager
in 2.26+)或通过@Inject
(或其他注入)注释。即使这是默认范围,RequestScope
和Singleton
范围也更适合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