我确实尝试过,发现使用 Spring @Component 注释对 Jersey 资源进行注释是可选的。如果您使用该注释,则资源的生命周期将由 Spring 管理,如果您不使用该注释,则生命周期将由 Jersey 管理。
需要注意的一件重要事情是,在默认情况下,生命周期的编程方式在两者之间存在重大差异。
正如泽西用户指南第 3.4 节所述“默认情况下,根资源类的生命周期是按请求进行的,即每次请求 URI 路径与根资源匹配时都会创建一个根资源类的新实例。这形成了一个非常自然的编程模型,可以使用构造函数和字段,而不用担心对同一资源的多个并发请求。一般来说,这不太可能是性能问题的原因。JVM 的类构建和垃圾收集已经大大改进年和许多对象将被创建和丢弃,以服务和处理 HTTP 请求并返回 HTTP 响应。 ”
但如Spring Framework 文档 第 1.5 节所述;默认情况下,bean 是单例的。“ Spring IoC 容器只创建由该 bean 定义定义的对象的一个实例。这个单个实例存储在此类单例 bean 的缓存中,并且该命名 bean 的所有后续请求和引用都返回缓存的对象。 ”
Hence there is a difference. Normal Jersey root resource classes by default are instantiated per-request, while with Spring when a resource is annotated with @Component it will be singleton. ie only one instance for the lifetime of the JVM. If you want Spring managed resources to have the same per-request life-cycle that comes with normal Jersey resources then you should add the Spring @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST)
annotation in addition to the @Component annotation. By adding it your resource life-cycle will now be per-request.