spring Quarkus中的@RequestScoped对于所有请求bean具有相同的哈希码

qqrboqgw  于 2023-04-28  发布在  Spring
关注(0)|答案(2)|浏览(235)

我使用了@RequestScoped与quarkus框架。我的要求是每个请求都必须创建新的对象。但是每当我检查所有请求的所有bean的哈希码时,它都是一样的。根据我的理解,如果第一个请求存在,它将创建一个具有一些hashcode的bean,每当第二个请求到来时,它将创建另一个具有不同hashcode的bean。但实际上是相同的hashcode。有谁能帮我弄清楚这背后的原因吗?

insrf1ej

insrf1ej1#

@RequestScoped bean以及所有其他普通作用域的bean都不会直接注入。相反,注入所谓的“客户端代理”。这个客户机代理在每次方法调用时查找正确的示例(在本例中,是属于“当前”请求的示例),并将方法调用转发给它。
所以,你所观察到的是完全在预料之中的。客户端代理只有一个示例,但这并不意味着每个请求都没有专用的示例。
有一个转折点。我说过所有的方法都被转发到正确的示例,所以你可能会认为哈希码对于不同的请求是不同的。但事实并非如此,因为CDI规范说:
java声明的所有方法的行为。lang.Object(toString()除外)对于客户端代理未定义。可移植应用程序不应该调用任何java声明的方法。lang.Object,toString()除外。
所以,哈希码不必不同。如果您真的想证明每个请求都得到一个不同的示例,那么在bean类的构造函数中生成一个惟一的ID,并通过某种方法公开它。

fykwrbwg

fykwrbwg2#

如果一个bean类有@RequestScoped注解,CDI将在第一次调用bean方法时延迟示例化该bean。这样的bean只存在于用于处理单个HTTP请求的链中。
点击此链接获取更多信息-〉@RequestScoped

相关问题