将Jersey与Spring Boot结合使用

问题描述

Spring Boot参考文档标题7.3 JAX-RS and Jersey的部分提到:“ 所有注册的端点都应该是具有HTTP资源注释(@GET和其他)的@Components 。是Spring @Component,其生命周期由Spring管理,您可以使用@Autowired批注注入依赖项,并使用@Value批注注入外部配置“。

但是我不在乎将依赖项注入或将外部配置注入到我的Jersey资源中,因此我没有将我的Jersey资源注释为@Components。我的应用程序运行正常。

通过阅读Spring Boot参考文档,似乎需要将Jersey资源注册为@Components。但这似乎并非如此。对我来说,这似乎是Spring Boot参考文档中的一个错误。可能是文档可以从“ 注册端点应该为@Components ”更新为“ 注册端点可以为@Components ” em>”。这有道理吗?

解决方法

我确实进行了尝试,发现使用Spring @Component注释对Jersey资源进行注释是可选的。如果您使用该注释,则资源的生命周期将由Spring管理,如果不使用该注释,则生命周期将由Jersey管理。

需要注意的重要一件事是,两者之间在默认情况下如何设置生命周期是有很大区别的。

section 3.4Jersey User Guide中所述,“ 默认情况下,根资源类的生命周期是每个请求的生命周期,即创建根资源类的新实例。每当请求URI路径与根资源匹配时,这将形成一个非常自然的编程模型,其中可以使用构造函数和字段,而无需考虑对同一资源的多个并发请求,通常这不太可能导致性能问题。多年来,JVM的类构造和垃圾收集有了很大的改进,将创建并丢弃许多对象来服务和处理HTTP请求并返回HTTP响应。

但是正如Spring Framework Documentation section 1.5中所述;默认情况下,bean是单例。 “ Spring IoC容器仅创建该bean定义所定义的对象的一个​​实例。该单个实例存储在此类单例bean的缓存中,并且对该命名bean的所有后续请求和引用都返回该缓存的对象。

因此有区别。默认情况下,普通的Jersey根资源类是按请求实例化的,而对于Spring,使用@Component注释资源时,它将是单例的。即在JVM的生命周期中只有一个实例。如果您希望Spring托管的资源具有与常规Jersey资源相同的每个请求生命周期,则除了@Component注释之外,还应该添加Spring @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST)注释。通过添加它,您的资源生命周期现在将按请求进行。