私は、異なるコントローラで異なる種類の私の一般的なクラスをautowire場合は、春のコンテナには、それぞれの新しいインスタンスを作成しますか?
私はジェネリッククラスを持っていると仮定します。
@Component
class MyClass<T, K>{
public K doStuff(T t){
// some logic here
}
}
コントローラIの使用で
@Autowired
MyClass<Employee, Integer> myClass;
別のコントローラIの使用で
@Autowired
MyClass<Manager, String> myClass;
私はそれが春を使用するためのテストを行いました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
あなたはあなたのために、一般的な豆は、デフォルトではシングルトンであるという事実を、見ることができるように、それはアプリケーションコンテキストによって返される-予告ハッシュコードの六角オブジェクトを印刷する場合-それは同じです。我々が変更した場合MyClass
、プロトタイプに豆のスコープを、出力は次のようになります。
test.example.MyClass@533b266e
1
test.example.MyClass@62679465
test
予想通り - アプリケーションコンテキストは、新しいBeanのために照会されるたびに新しいインスタンスを取得します。
質問に対する答えは、そう:
春のコンテナは、同じジェネリッククラスに属するが、異なる種類を使用するオブジェクトのための新しいBeanを作成していますか?
です:いいえ、それはしません。
そして、それは私たちがフィリップ・ウェッブさんのコメントを参照することができますどのように機能するかにいくつかの光を当てるためには、掲載ここに:
消去はオブジェクトレベルで起こるが、バイトコードではまだ多くの情報があります。で開始することにより
field
、parameter
またはreturn
我々はまだそこにいた情報を調べることができます入力します。あなたが見た場合たとえば、java.lang.reflect.Method
あなたに加えていることがわかりますgetReturnType
つまりgetGenericReturnType
、より多くの情報を提供する方法。SpringのResolvableType
アクセスにこの情報を容易にするだけで試行。