iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring实现泛型注入的示例详解
  • 461
分享到

Spring实现泛型注入的示例详解

2024-04-02 19:04:59 461人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录1.spring泛型注入2. 关于java泛型有四种TypeGenericArrayType泛型数组类型ParameterizedType参数化类型TypeVariable 类型

1.Spring泛型注入

创建一个抽象泛型类BaseDao,有参数化类型T

public abstract class BaseDao<T> {
    
  public abstract void eat();
}

每种动物有不同的行为,猫、狗

public class Cat {

}

public class Dog {

}

分别继承BaseDao实现不同的行为 

@Repository
public class CatDao extends BaseDao<Cat> {

  @Override
  public void eat() {
    System.out.println("cat eat....");
  }
}
@Repository
public class DogDao extends BaseDao<Dog> {

  @Override
  public void eat() {
    System.out.println("dog eat....");
  }
}

接着创建一个抽象业务类,也有参数化类型T。

注意:此处不能使用@Resource注入,会找到多个BaseDao类型的bean,无法确认注入哪一个bean会报错

需要使用@Autowired注入,它有根据泛型参数匹配的逻辑,会一个个去匹配

public abstract class BaseService<T> {

  @Autowired
  private BaseDao<T> baseDao;


  protected void eat() {
    baseDao.eat();
  }
}

子类继承BaseService指定参数化类型实现注入相应的BaseDao

@Service
public class CatService extends BaseService<Cat> {


}
@Service
public class DogService extends BaseService<Dog> {

}

代码目录

测试 

@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 TestClass<S> {

    // 泛型数组
    private List<String>[] 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.List<java.lang.String>[]
java.util.List<java.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 Test<T> {

    public abstract void test(T t);

  }

  public static class TestClass<T extends Number> extends Test<Integer> {

    private List<T> tList;

    private List<? extends Number> list;

    private Map<String, Integer> map;

    @Override
    public void test(Integer o) {

    }
  }


  public static void main(String[] args) {
    TestClass<Integer> 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 TestClass<S extends Number, T> {

    private Map<S, 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泛型注入内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Spring实现泛型注入的示例详解

本文链接: https://www.lsjlt.com/news/153813.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring实现泛型注入的示例详解
    目录1.Spring泛型注入2. 关于java泛型有四种TypeGenericArrayType泛型数组类型ParameterizedType参数化类型TypeVariable 类型...
    99+
    2024-04-02
  • Java中泛型的示例详解
    目录泛型概述使用泛型的好处泛型的定义与使用定义和使用含有泛型的类含有泛型的方法含有泛型的接口泛型通配符通配符基本使用通配符高级使用----受限泛型泛型概述 我们都知道集合中是可以存放...
    99+
    2022-11-13
    Java泛型机制 Java泛型
  • Java泛型的类型擦除示例详解
    目录前言泛型的类型擦除原则是:1 擦除类定义中的类型参数1.1 无限制类型擦除1.2 有限制类型擦除2 擦除方法定义中的类型参数3 桥接方法和泛型的多态总结参考资料前言 Java泛型...
    99+
    2024-04-02
  • java 泛型的详解及实例
    java 泛型的详解及实例Java在1.5版本中增加了泛型,在没有泛型之前,从集合中读取每一个对象都需要进行强转,如果一不小心插入了类型错误的对象,在运行时就会报错,给日常开发带来了很多不必要的麻烦,比如以下代码:public class ...
    99+
    2023-05-31
    java 泛型 ava
  • C#泛型的使用及示例详解
    目录一、什么是泛型二、为什么使用泛型三、泛型类型参数四、泛型类五、泛型约束六、泛型的协变和逆变七、泛型缓存这篇文章主要讲解C#中的泛型,泛型在C#中有很重要的地位,尤其是在搭建项目框...
    99+
    2024-04-02
  • Spring注解实现Bean自动装配示例详解
    何为自动装配 自动装配是 Spring 满足 bean 依赖的一种方式。 在使用 Spring 配置 bean 时,我们都要给配置的 bean 的属性设置一个值,如果不手动设置则都...
    99+
    2024-04-02
  • Java 获取泛型的类型实例详解
    Java 获取泛型的类型实例详解Java 泛型实际上有很多缺陷,比如不能直接获取泛型的类型,不能获取带泛型类等。以下方式是不正确的:①.获取带泛型的类的类型Class lstUClazz = List<User>.class...
    99+
    2023-05-31
    java 泛型 类型
  • Kotlin泛型的型变之路演变示例详解
    目录引言协变协变的限制逆变逆变的限制Kotlin型变Kotlin泛型的优化申明处型变reified支持协变的List获取泛型的具体类型reified传入指定Class匿名内部类反射P...
    99+
    2022-12-21
    Kotlin 泛型型变 Kotlin 泛型
  • SQL注入的实现以及防范示例详解
    什么是SQL注入 SQL注入是指通过构建特殊的输入篡改原来的SQL语句达到攻击者所需的操作。 Sql 注入产生原因 我们访问动态网页时往往会向服务器发送请求,服务器向数据访问层发...
    99+
    2024-04-02
  • TypeScript泛型约束条件示例详解
    目录什么是泛型泛型的应用场景泛型约束(限制条件)泛型函数调用指定类型总结什么是泛型 两个值之间存在的对应关系,就可以用泛型来解决 泛型的应用场景 当一个函数的返回值的类型需要与此函数...
    99+
    2024-04-02
  • Spring依赖注入(DI)两种方式的示例详解
    目录一、依赖注入方式二、setter注入引用类型简单类型三、构造器注入引用类型简单类型参数适配(了解)四、依赖注入方式选择一、依赖注入方式 思考:向一个类中传递数据的方式有几种? 普...
    99+
    2024-04-02
  • Spring AOP 实现自定义注解的示例
    目录1. 注解如下:2. 切面自工作后,除了一些小项目配置事务使用过 AOP,真正自己写 AOP 机会很少,另一方面在工作后还没有写过自定义注解,一直很好奇注解是怎么实现他想要的功能...
    99+
    2024-04-02
  • Spring @Conditional注解示例详细讲解
    目录前言:示例:标注在方法上:标注在类上:多个条件类:前言: @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。 @...
    99+
    2022-11-13
    Spring @Conditional注解 Spring @Conditional注解使用
  • Kotlin 泛型详解及简单实例
     Kotlin 泛型详解概述一般类和函数,只能使用具体的类型:要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的约束对代码的限制很大。而OOP的多态采用了一种泛化的机制,在SE 5种,Java引用了泛...
    99+
    2023-05-31
    kotlin 泛型
  • Java中泛型使用实例详解
    Java中泛型使用泛型作用:泛型:集合类添加对象不用强转反射机制:将泛型固定的类的所有方法和成员全部显示出来 核心代码:ArrayList<Ls> ff=new ArrayList()<Ls>;Ls ls1...
    99+
    2023-05-31
    java 泛型 ava
  • Java泛型Generic机制实例详解
    目录泛型是什么?泛型类泛型方法类型变量的限制类型擦除通配符上界通配符下界通配符无界通配符反射和泛型类型字面量限制和局限性不能使用基本类型实例化类型参数运行时类型查询只适用于原始类型不...
    99+
    2022-11-13
    Java 泛型 Generic Java Generic
  • Java泛型之类型擦除实例详解
    目录前言泛型是什么?泛型的定义和使用泛型类泛型方法泛型类与泛型方法的共存现象泛型接口通配符?无限定通配符<><extendsT>类型擦除类型擦除带来的局限性泛...
    99+
    2024-04-02
  • Spring Bean注册与注入实现方法详解
    目录1. 逻辑上的 Bean 注册2. XML 注册 Bean 到自建的库中2.1 工厂方法2.2 使用工厂方法和实例化工厂注册 Bean3. XML 配合注解进行 Bean 注册4...
    99+
    2022-11-13
    Spring Bean注册与注入 Spring Bean注册 Spring Bean注入
  • TypeScrip中泛型的案例详解
    泛型的定义 // 需求一: 泛型 可以支持不特定的数据类型, 要求,传入的参数和返回参数一致 // 这种方式虽然能实现传入和返回的参数一致,但是失去类型参数检验 // 定义...
    99+
    2024-04-02
  • C++实现支持泛型的LFU详解
    首先定义LFU存储数据节点ListNode的结构, 此结构支持键K和值V的模板,为了在有序元素中实现比较(严格小于),这里需要重载小于号,如果此数据的使用频次最少,则小于结果为tru...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作