領域

為什麼我需要這些無引數建構函式?

*如果會話範圍的 bean 被注入到應用程式範圍的 bean 中會發生什麼?應用程式作用域 bean 如何為每個請求獲取正確的會話範圍 bean 例項?會話範圍內的 bean 不會洩漏到其他請求中嗎?這是如何運作的?*為了便於確定範圍,CDI 使用所謂的代理。當 CDI 將非依賴的 scoped bean 注入另一個物件時,它不會直接注入 bean。相反,它將該 bean 子類化以建立所謂的代理。每當在代理上呼叫一個方法時,它都會要求 CDI 執行時查詢該特定範圍的正確 bean(如果它的請求作用域,則獲取該請求的 bean。如果它是會話作用域,則獲取該會話的 bean。等等。),然後將呼叫轉發給真實物件,返回非 void 方法的任何結果。這意味著以下是可以做的事情:

@ApplicationScoped
public class ApplicationScopedClass {

    private final RequestScopedClass requestScopedClass;

    @Inject
    public ApplicationScopedClass(RequestScopedClass requestScopedClass) {
        this.requestScopedClass = requestScopedClass;
    }

    public ApplicationScopedClass() {

    }

    public doSomething() {
        requestScopedClass.doSomethingRequestSpecific(); //This works, because of the proxy
    }

}

但是,為了使類在 Java 中合法地子類化另一個類,它必須具有有效的建構函式。並且有效的建構函式必須呼叫類上的另一個建構函式或父類的建構函式(例如 super())。為了簡化這個子類,CDI 規範要求任何非依賴的 scoped bean 提供一個公共的無引數建構函式,這樣執行時就不必試著猜測如何處理需要代理的類。。