我知道默认情况下 JAX-RS 端点生命周期是once-per-request,因此可以将请求特定信息注入(inject)到实例中。
我们还可以制作一个端点单例,意思是每个应用程序一次,其中请求特定信息不能注入(inject)到实例中,而是可以注入(inject)到请求的方法中。
1. 所以我想知道在性能方面哪种方法更好,once-per-request 或每次申请一次。
2. 除了注入(inject)请求的具体信息,我还想知道这些方法的优缺点
3.您更喜欢在 API 应用程序中使用哪种方法
注意:到目前为止,我一直在使用每个请求一次的方法,但我一直想知道这种方法是否有效,它确实使编码更容易且可重用。
最佳答案
从你的最后一个问题开始:我一直使用默认值(根据请求),而且我很少到了想要更改它的地步。
偏爱其中一个的原因可能是什么?
- 如果您想提供一些静态内容(可能是您的 API 的欢迎文档),只生成一次该内容并将其保存在一个单独的资源类中是有意义的。但是您可以通过例如实现相同的目标在每个请求范围的资源类中注入(inject)一个
@ApplicationScoped
CDI bean。 - 如果您更喜欢将
@xxxParam
值(如@QueryParam
)作为字段而不是方法参数注入(inject),您应该使用每个请求的生命周期。单例不支持此功能。 (这不包括通过@Context
注入(inject))。
我做了一个小测试来比较两者的性能。您可以找到 sources和 results在github上。简而言之:我测量到大约 1.5% 的差异。我认为这不会对您的申请产生太大影响。 比较 results of the JVisualVM monitoring我倾向于说每个请求测试使用更多内存,但您应该自己决定这是否真的会影响您的应用程序。
关于java - JAX-RS 资源生命周期性能影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30409895/