![](/img/trans.png)
[英]Spring configuration in Java - Create and use 2 beans of same class NOT using Autowired
[英]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在這里發表的評論:
雖然擦除發生在對象級別,但字節碼中仍有很多信息。 通過從
field
,parameter
或return
類型開始,我們可以檢查仍然存在的信息。 例如,如果你看一下java.lang.reflect.Method
,除了getReturnType
之外你還會看到getGenericReturnType
方法,它提供了更多的信息。 Spring的ResolvableType
只是試圖讓這些信息更容易訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.