gpt4 book ai didi

java - spring容器是否为属于同一通用类但使用不同类型的对象创建新的bean?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:23:45 26 4
gpt4 key购买 nike

如果我在不同 Controller 中使用不同类型 Autowiring 泛型类,spring 容器是否会为每个类型创建新实例?

假设我有一个泛型类。

@Component
class MyClass<T, K>{

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

}

在我使用的 Controller 中

@Autowired
MyClass<Employee, Integer> myClass;

在我使用的另一个 Controller 中

@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 是单例,因此它由应用程序上下文返回 - 请注意打印对象时哈希码的十六进制 - 它是相同的。当我们将 MyClass bean 范围更改为原型(prototype)时,输出为:

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

只要为新 bean 查询应用程序上下文,您就会获得新实例 - 正如预期的那样。

所以问题的答案:

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

是:不,不是

为了阐明其工作原理,我们可以引用 Phillip Webb 发表的评论 here :

Although erasure happens at the object level, there's a lot of information still in the bytecode. By starting at a field, parameter or return type we can inspect the information that's still there. For example, if you look at java.lang.reflect.Method you'll see that in addition to getReturnType that is a getGenericReturnType method which provides a lot more information. Spring's ResolvableType just tries to make this information easier to access.

关于java - spring容器是否为属于同一通用类但使用不同类型的对象创建新的bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57120575/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com