簡體   English   中英

Spring容器是否為屬於同一泛型類但使用不同類型的對象創建新bean?

[英]Does spring container create new beans for the objects which belong to same generic class but use different types?

如果我在不同控制器中使用不同類型的通用類自動裝配,那么spring容器是否為每個控件創建新實例?

假設我有一個泛型類。

@Component
class MyClass<T, K>{

    public K doStuff(T t){
        // some logic here
    }

}

在我使用的控制器中

@Autowired
MyClass<Employee, Integer> myClass;

在我使用的另一個控制器中

@Autowired
MyClass<Manager, String> myClass;

我使用Spring 5.1.6-RELEASE對它進行了測試。 這是代碼和輸出:

@Component
public class TestClassWithInteger {

    private MyClass<Integer, Integer> myClass;

    @Autowired
    public TestClassWithInteger(MyClass<Integer, Integer> myClass) {
        this.myClass = myClass;

        this.perform();
    }


    public void perform() {
        System.out.println(myClass);
        myClass.doStuff(1);
    }
}

@Component
public class TestClassWithString {

    private MyClass<String, String> myClass;

    @Autowired
    public TestClassWithString(MyClass<String, String> myClass) {
        this.myClass = myClass;

        this.perform();
    }


    public void perform() {
        System.out.println(myClass);
        myClass.doStuff("test");
    }
}

@Component
class MyClass<T, K>{

    public K doStuff(T t){
        System.out.println(t);
        return null;
    }

}

輸出是:

test.example.MyClass@841e575
1
test.example.MyClass@841e575
test

正如您所看到的,因為默認情況下您的通用bean是單例,它由應用程序上下文返回 - 在打印對象時注意hashcode的十六進制 - 它是相同的。 當我們將MyClass bean范圍更改為prototype時,輸出為:

test.example.MyClass@533b266e
1
test.example.MyClass@62679465
test

每當查詢新bean的應用程序上下文時,您都會獲得新實例 - 正如預期的那樣。

所以問題的答案是:

Spring容器是否為屬於同一泛型類但使用不同類型的對象創建新bean?

是: 不,它沒有

為了闡明它是如何工作的,我們可以參考Phillip Webb在這里發表的評論:

雖然擦除發生在對象級別,但字節碼中仍有很多信息。 通過從fieldparameterreturn類型開始,我們可以檢查仍然存在的信息。 例如,如果你看一下java.lang.reflect.Method ,除了getReturnType之外你還會看到getGenericReturnType方法,它提供了更多的信息。 Spring的ResolvableType只是試圖讓這些信息更容易訪問。

暫無
暫無

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

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