Spring泛型注入有几种,如何实现?
1.Spring泛型注入
创建一个抽象泛型类BaseDao,有参数化类型T
public abstract class BaseDaoT>
{
public abstract void eat();
}
每种动物有不同的行为,猫、狗
public class Cat {
}
public class Dog {
}
分别继承BaseDao实现不同的行为
@Repository
public class CatDao extends BaseDaoCat>
{
@Override
public void eat() {
System.out.println("cat eat....");
}
}
@Repository
public class DogDao extends BaseDaoDog>
{
@Override
public void eat() {
System.out.println("dog eat....");
}
}
接着创建一个抽象业务类,也有参数化类型T。
注意:此处不能使用@Resource注入,会找到多个BaseDao类型的bean,无法确认注入哪一个bean会报错
需要使用@Autowired注入,它有根据泛型参数匹配的逻辑,会一个个去匹配
public abstract class BaseServiceT>
{
@Autowired
private BaseDaoT>
baseDao;
protected void eat() {
baseDao.eat();
}
}
子类继承BaseService指定参数化类型实现注入相应的BaseDao
@Service
public class CatService extends BaseServiceCat>
{
}
@Service
public class DogService extends BaseServiceDog>
{
}
代码目录
测试
@Configuration
@ComponentScan(value = "com.monian.test.generic")
public class GenericConfig {
}
public class GenericTests {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(GenericConfig.class);
applicationContext.refresh();
DogService dogService = applicationContext.getBean(DogService.class);
CatService catService = applicationContext.getBean(CatService.class);
dogService.eat();
catService.eat();
}
}
结果输出,成功注入相应的BaseDao
2. 关于java泛型有四种Type
GenericArrayType泛型数组类型
public class GenericArrayTypeTest {
public static class TestClassS>
{
// 泛型数组
private ListString>
[] lists;
// 泛型数组
private S[] ss;
private String[] s;
}
public static void main(String[] args) {
Class cl = TestClass.class;
for (Field field : cl.getDeclaredFields()) {
System.out.println("filed's name:" + field.getName());
Type genericType = field.getGenericType();
System.out.println("Is it genericArrayType:" + (genericType instanceof GenericArrayType));
if (genericType instanceof GenericArrayType) {
GenericArrayType genericArrayType = (GenericArrayType) genericType;
System.out.println(genericArrayType.getTypeName());
Type genericComponentType = genericArrayType.getGenericComponentType();
System.out.println(genericComponentType);
}
System.out.println();
}
}
}
result:
filed's name:lists
Is it genericArrayType:true
java.util.Listjava.lang.String>
[]
java.util.Listjava.lang.String>
filed's name:ss
Is it genericArrayType:true
S[]
S
filed's name:s
Is it genericArrayType:false
ParameterizedType参数化类型
public class ParameterizedTypeTest {
public static abstract class TestT>
{
public abstract void test(T t);
}
public static class TestClassT extends Number>
extends TestInteger>
{
private ListT>
tList;
private List? extends Number>
list;
private MapString, Integer>
map;
@Override
public void test(Integer o) {
}
}
public static void main(String[] args) {
TestClassInteger>
tt = new TestClass>
();
Class cl = tt.getClass();
Type genericSuperclass = cl.getGenericSuperclass();
assert genericSuperclass instanceof ParameterizedType;
ParameterizedType parameterizedType1 = (ParameterizedType) genericSuperclass;
System.out.println(parameterizedType1.getActualTypeArguments()[0]);
for (Field field : cl.getDeclaredFields()) {
System.out.println("field's name:" + field.getName());
Type genericType = field.getGenericType();
System.out.println("Is it ParameterizedType:" + (genericType instanceof ParameterizedType));
if (genericType instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) genericType;
for (Type type : parameterizedType.getActualTypeArguments()) {
System.out.println("actualType:" + type);
System.out.println(type.getTypeName());
}
}
System.out.println();
}
}
}
result:
class java.lang.Integer
field's name:tList
Is it ParameterizedType:true
actualType:T
T
field's name:list
Is it ParameterizedType:true
actualType:? extends java.lang.Number
? extends java.lang.Number
field's name:map
Is it ParameterizedType:true
actualType:class java.lang.String
java.lang.String
actualType:class java.lang.Integer
java.lang.Integer
TypeVariable 类型变量
public class TypeVariableTest {
public static class TestClassS extends Number, T>
{
private MapS, T>
map;
}
public static void main(String[] args) throws Exception {
Class cl = TestClass.class;
Field field = cl.getDeclaredField("map");
Type genericType = field.getGenericType();
ParameterizedType parameterizedType = (ParameterizedType) genericType;
for (Type type : parameterizedType.getActualTypeArguments()) {
TypeVariable typeVariable = (TypeVariable) type;
// 类型变量名
System.out.println(typeVariable.getName());
// 变量上边界
Type[] bounds = typeVariable.getBounds();
System.out.println(Arrays.toString(bounds));
}
}
}
result:
S
[class java.lang.Number]
T
[class java.lang.Object]
WildcardType 通配符类型
public class WildcardTypeTest {
public static class TestClass {
private List? extends Number>
lists;
private Set?>
sets;
private Map? extends Number, ? super String>
map;
}
public static void main(String[] args) {
Class cl = TestClass.class;
for (Field field : cl.getDeclaredFields()) {
System.out.println("filed's name:" + field.getName());
Type genericType = field.getGenericType();
ParameterizedType parameterizedType = (ParameterizedType) genericType;
for (Type type : parameterizedType.getActualTypeArguments()) {
// 通配符类型
WildcardType wildcardType = (WildcardType) type;
System.out.println(wildcardType.getTypeName());
// 上边界
System.out.println("上边界" + Arrays.toString(wildcardType.getUpperBounds()));
// 下边界
System.out.println("下边界" + Arrays.toString(wildcardType.getLowerBounds()));
}
System.out.println();
}
}
}
result:
filed's name:lists
? extends java.lang.Number
上边界[class java.lang.Number]
下边界[]
filed's name:sets
?
上边界[class java.lang.Object]
下边界[]
filed's name:map
? extends java.lang.Number
上边界[class java.lang.Number]
下边界[]
? super java.lang.String
上边界[class java.lang.Object]
下边界[class java.lang.String]
注:spring对泛型的解析主要是在ResolvableType类,掌握上述的基本知识后可以去阅读下相关源码
到此这篇关于“Spring泛型注入有几种,如何实现?”的文章就介绍到这了,感谢各位的阅读,更多相关Spring泛型注入有几种,如何实现?内容,欢迎关注网络资讯频道,小编将为大家输出更多高质量的实用文章!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Spring泛型注入有几种,如何实现?
本文地址: https://pptw.com/jishu/652205.html
