最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring實(shí)現(xiàn)泛型注入的示例詳解

 更新時(shí)間:2022年07月08日 08:18:25   作者:默念x  
Spring?4.0版本中更新了很多新功能,其中比較重要的一個(gè)就是對(duì)帶泛型的Bean進(jìn)行依賴(lài)注入的支持。本文將通過(guò)實(shí)例詳細(xì)講講Spring如何實(shí)現(xiàn)泛型注入,需要的可以參考一下

1.Spring泛型注入

創(chuàng)建一個(gè)抽象泛型類(lèi)BaseDao,有參數(shù)化類(lèi)型T

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

每種動(dòng)物有不同的行為,貓、狗

public class Cat {

}

public class Dog {

}

分別繼承BaseDao實(shí)現(xiàn)不同的行為 

@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....");
  }
}

接著創(chuàng)建一個(gè)抽象業(yè)務(wù)類(lèi),也有參數(shù)化類(lèi)型T。

注意:此處不能使用@Resource注入,會(huì)找到多個(gè)BaseDao類(lèi)型的bean,無(wú)法確認(rèn)注入哪一個(gè)bean會(huì)報(bào)錯(cuò)

需要使用@Autowired注入,它有根據(jù)泛型參數(shù)匹配的邏輯,會(huì)一個(gè)個(gè)去匹配

public abstract class BaseService<T> {

  @Autowired
  private BaseDao<T> baseDao;


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

子類(lèi)繼承BaseService指定參數(shù)化類(lèi)型實(shí)現(xiàn)注入相應(yīng)的BaseDao

@Service
public class CatService extends BaseService<Cat> {


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

}

代碼目錄

測(cè)試 

@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();
  }

}

結(jié)果輸出,成功注入相應(yīng)的BaseDao

2. 關(guān)于java泛型有四種Type

GenericArrayType泛型數(shù)組類(lèi)型

public class GenericArrayTypeTest {


  public static class TestClass<S> {

    // 泛型數(shù)組
    private List<String>[] lists;

    // 泛型數(shù)組
    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參數(shù)化類(lèi)型

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 類(lèi)型變量

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;
      // 類(lèi)型變量名
      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 通配符類(lèi)型 

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()) {
        // 通配符類(lèi)型
        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對(duì)泛型的解析主要是在ResolvableType類(lèi),掌握上述的基本知識(shí)后可以去閱讀下相關(guān)源碼

到此這篇關(guān)于Spring實(shí)現(xiàn)泛型注入的示例詳解的文章就介紹到這了,更多相關(guān)Spring泛型注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)連接nacos并支持多環(huán)境部署

    SpringBoot實(shí)現(xiàn)連接nacos并支持多環(huán)境部署

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)連接nacos并支持多環(huán)境部署方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 如何通過(guò)Java監(jiān)聽(tīng)MySQL數(shù)據(jù)的變化

    如何通過(guò)Java監(jiān)聽(tīng)MySQL數(shù)據(jù)的變化

    對(duì)于二次開(kāi)發(fā)來(lái)說(shuō),很大一部分就找找文件和找數(shù)據(jù)庫(kù)的變化情況,下面這篇文章主要給大家介紹了關(guān)于如何通過(guò)Java監(jiān)聽(tīng)MySQL數(shù)據(jù)的變化的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • 詳解Java8中CompletableFuture類(lèi)的使用

    詳解Java8中CompletableFuture類(lèi)的使用

    Java?8中引入了CompletableFuture類(lèi),它是一種方便的異步編程工具,可以處理各種異步操作,本文將詳細(xì)介紹CompletableFuture的使用方式,希望對(duì)大家有所幫助
    2023-04-04
  • 用java實(shí)現(xiàn)在txt文本中寫(xiě)數(shù)據(jù)和讀數(shù)據(jù)的方法

    用java實(shí)現(xiàn)在txt文本中寫(xiě)數(shù)據(jù)和讀數(shù)據(jù)的方法

    今天小編就為大家分享一篇用java實(shí)現(xiàn)在txt文本中寫(xiě)數(shù)據(jù)和讀數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • SpringSecurity?Web權(quán)限方案實(shí)現(xiàn)全過(guò)程

    SpringSecurity?Web權(quán)限方案實(shí)現(xiàn)全過(guò)程

    Spring Security是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和授權(quán)框架,專(zhuān)門(mén)用于保護(hù)Java應(yīng)用程序的Web集成,下面這篇文章主要給大家介紹了關(guān)于SpringSecurity?Web權(quán)限方案實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Java中JVM常用參數(shù)配置教程(提供配置示例)

    Java中JVM常用參數(shù)配置教程(提供配置示例)

    這篇文章主要給大家介紹了關(guān)于Java中JVM常用參數(shù)配置的相關(guān)資料, jvm的參數(shù)有很多,必須知道參數(shù)分類(lèi)并且記住面試常見(jiàn)的幾個(gè)參數(shù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • 詳解java中BigDecimal精度問(wèn)題

    詳解java中BigDecimal精度問(wèn)題

    這篇文章主要介紹了java BigDecimal精度問(wèn)題,對(duì)精確計(jì)算感興趣的同學(xué),可以參考下
    2021-05-05
  • 淺談利用Session防止表單重復(fù)提交

    淺談利用Session防止表單重復(fù)提交

    這篇文章主要介紹了淺談利用Session防止表單重復(fù)提交,簡(jiǎn)單介紹表單重復(fù)提交的情況,分析,以及解決方法代碼示例,具有一定借鑒價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • SpringBoot集成JPA持久層框架,簡(jiǎn)化數(shù)據(jù)庫(kù)操作

    SpringBoot集成JPA持久層框架,簡(jiǎn)化數(shù)據(jù)庫(kù)操作

    JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化規(guī)范。主要是為了簡(jiǎn)化持久層開(kāi)發(fā)以及整合ORM技術(shù),結(jié)束Hibernate、TopLink、JDO等ORM框架各自為營(yíng)的局面。JPA是在吸收現(xiàn)有ORM框架的基礎(chǔ)上發(fā)展而來(lái),易于使用,伸縮性強(qiáng)。
    2021-06-06
  • maven多模塊項(xiàng)目依賴(lài)管理與依賴(lài)?yán)^承詳解

    maven多模塊項(xiàng)目依賴(lài)管理與依賴(lài)?yán)^承詳解

    這篇文章主要介紹了maven多模塊項(xiàng)目依賴(lài)管理與依賴(lài)?yán)^承詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評(píng)論

濮阳县| 宣恩县| 石棉县| 富阳市| 河池市| 临猗县| 登封市| 右玉县| 根河市| 新河县| 涟源市| 竹溪县| 四平市| 崇文区| 河间市| 视频| 观塘区| 茌平县| 壤塘县| 张家界市| 江川县| 平乐县| 三门县| 北宁市| 通化市| 皮山县| 大化| 怀远县| 葫芦岛市| 夏河县| 玉树县| 绍兴县| 嘉义市| 民县| 娱乐| 名山县| 清苑县| 宁明县| 黑山县| 临颍县| 攀枝花市|