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



我在quarkus框架中使用了@RequestScoped。我的要求是每个请求都必须创建新对象。但每当我检查了所有bean for all请求的哈希代码时,它都是一样的。意思是说,根据我的理解,如果第一个请求在那里,它会创建一个有一些哈希代码的bean,每当第二个请求到来时,它都会创建另一个有不同哈希代码的bean。但实际上,它是相同的哈希代码。有人能帮我知道背后的原因吗?

@RequestScopedbean以及所有其他正常作用域的bean都不会直接注入。相反,注入了一个所谓的客户端代理。这个客户端代理在每次方法调用时都会查找正确的实例(在这种情况下,是属于"当前"请求的实例(,并将方法调用转发给它

所以,你所观察到的完全是意料之中的事。客户端代理有一个实例,但这并不意味着每个请求都没有一个专用实例。

这里有一个转折点。我说过所有方法都转发到正确的实例,所以你可能会认为哈希代码对于不同的请求会有所不同。但事实并非如此,因为CDI规范中写道:

java.lang.Object声明的所有方法的行为,除了toString((之外,对于客户端代理都是未定义的。可移植应用程序不应在客户端代理上调用java.lang.Object声明的任何方法,toString((除外。

所以不,哈希代码不必不同。如果您真的想证明每个请求都得到一个不同的实例,那么在bean类的构造函数中生成一个唯一的ID,并通过某种方法公开它。

如果bean类具有注释@RequestScoped,CDI将在对bean方法的第一次调用期间延迟实例化bean。这样的bean只存在于用于处理单个HTTP请求的链中。

有关详细信息,请单击此链接->请求范围

最新更新