簡體   English   中英

如果我在 Guice 中使用字段注入,為什么我只能使用無參數構造函數?

[英]If I use field injection with Guice, why can I only use the no arg constructor?

這是一個例子:

public class Dog implements Animal{
    private  String color;

    @Inject
    private  Owner owner;

    //This constructor always used to build the Dog object.
    public Dog(){}

    public Dog(String random){}
}

這是限制還是默認行為? 有什么方法可以使用參數化構造函數來構建 Dog object? 這似乎是一個限制,所以我一定遺漏了一些東西。

@Inject注釋你的其他構造函數

想想看。 Guice 是一個依賴注入 (DI) 框架。 這意味着 Guice 負責創建對象。

因此,Guice 需要知道一些事情。 其中第一個是如何創建新實例。 因此,Guice(以及大多數其他 DI 框架)制定了一些關於如何創建新對象的約定。

Guice 創建對象的約定如下:提供無參數構造函數或使用@Inject對其進行注釋。 為什么要使用無參數構造函數? 因為它的所有參數都是已知的:沒有。 創建一個沒有任何參數的 object 很容易。

如果有任何參數,例如您的示例中的String ,Guice 如何知道要注入哪個String 好吧,您可能會說您在模塊中提供它,這很公平。 但是在您的示例中,您有多個構造函數。 Guice 如何知道要使用哪個構造函數? 好吧,讓我們標准化並說允許最容易構造的而不是其他的。 因此,讓我們使用無參數構造函數進行實例化。

請注意,您可以將字段注入與構造函數注入相關聯,但為此,您最多只能使用@Inject注解一個構造函數。 以下代碼完全有效:

public class Dog implements Animal{
    private  String color;

    @Inject
    private  Owner owner;

    //This constructor always used to build the Dog object.
    public Dog(){}

    @Inject public Dog(String random){} // Note the @Inject annotation.
}

請注意Guice 的@Inject的 Javadoc是相當明確的(強調我的):

正在構造的 class 必須恰好有一個標有@Inject的構造函數,或者必須有一個不帶參數的構造函數 `Injector 然后繼續執行現場和方法注入。

另外,請注意@javax.inject.Inject的 Javadoc

可注入的構造函數用@Inject注釋,並接受零個或多個依賴項@Inject @Inject 最多可以應用於每個 class 的一個構造函數。

[...]

當沒有其他構造函數存在時,@ @Inject對於公共的無參數構造函數是可選的 這使注入器能夠調用默認構造函數。

[...]

所以要回答你的問題,,不可能請求 Guice 在你的構造函數中注入一個String參數而不用@Inject注釋它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM