Java 在CDI中,较短范围的Bean实例注入到较大范围的Bean实例中-它是如何工作的?

Java 在CDI中,较短范围的Bean实例注入到较大范围的Bean实例中-它是如何工作的?,java,jakarta-ee,cdi,Java,Jakarta Ee,Cdi,考虑以下请求范围的CDIBean: @RequestScoped public class RequestScopedBean { // ... } 现在,我将其注入到应用程序范围的bean中: @ApplicationScoped public class ApplicationScopedBean { @Inject private RequestScopedBean requestScopedBean; // ... } 我运行了这段代码,并注意到请求范围的be

考虑以下请求范围的CDIBean:

@RequestScoped
public class RequestScopedBean {
    // ...
}
现在,我将其注入到应用程序范围的bean中:

@ApplicationScoped
public class ApplicationScopedBean {
    @Inject private RequestScopedBean requestScopedBean;
    // ...
}

我运行了这段代码,并注意到请求范围的bean实例在两个请求之间是不同的,但应用程序范围的bean实例是相同的。我的疑问是:这是如何工作的?请求范围的bean实例是否在每次请求时重新分配到应用程序范围的字段?或者应用程序范围bean的代理只是在请求之间更改?

在CDI中,每个注入的对象实际上是一个代理。因此,在这种情况下,代理可能持有对
RequestContext
的引用,并在每次方法调用时获得正确的bean实例。

在核心中为True,但在细节中为True
DependentScoped
Bean将永远不会被代理,以及
SingletonScoped
Bean。这两个作用域都是所谓的伪作用域。应用程序作用域是伪作用域吗?我不确定。无论如何,我的观点是关于特定的示例-请求上下文。不,不是ApplicationScope,而是。这就是为什么最好使用ApplicationScope:-)只是为了让其他人明白这一点,CDI中没有SingletonScope这样的东西,而是从“JSR-330 Java依赖注入”继承的不受欢迎的step child@javax.inject.Singleton。无论如何都应该避免这种情况发生,您的需求很可能会被任何方式处理的应用程序所满足。@jangroth章节给出了一个概述,但没有解释它到底是如何工作的。具体地说,当一个
@ApplicationScoped
bean注入了一个
@SessionScoped
bean,并从
@RequestScoped
方法接收到两个并行调用时会发生什么?您确实注意到这个问题是4年前提出的,并且CDI/Weld(及其文档)在此期间有过一些版本冲突吗?;)