成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring注入還可以這樣玩!漲知識了

開發(fā) 前端
假設(shè)你有兩個(gè) CommonDAO bean,每個(gè)都需要在不同的環(huán)境中使用。這時(shí),你可以使用 @Qualifier 來指定具體的 bean。

環(huán)境:Spring6.1.2

1. 簡介

@Qualifier是 Spring 框架中的一個(gè)注解,它用于消除自動裝配(autowiring)時(shí)的歧義。在 Spring 應(yīng)用程序中,當(dāng)存在多個(gè)相同類型的 bean 時(shí),自動裝配可能會產(chǎn)生歧義,因?yàn)?Spring 容器不知道該選擇哪個(gè) bean 進(jìn)行注入。這時(shí),我們可以使用 @Qualifier 注解來明確指定要注入的 bean。

假設(shè)你有兩個(gè) CommonDAO bean,每個(gè)都需要在不同的環(huán)境中使用。這時(shí),你可以使用 @Qualifier 來指定具體的 bean。

public class CommonService {
  @Resource
  @Qualifier
  private CommonDAO dao ;
}
@Configuration
public class AppConfig {
  @Bean
  @Qualifier
  public TeacherDAO teacherDAO() {
    return new TeacherDAO() ;
  }
  @Bean
  public StudentDAO studentDAO() {
    return new StudentDAO() ;
  }
  @Bean
  public CommonService commonService() {
    return new CommonService() ;
  }
}

上面示例中如果注入的CommonDAO字段上沒有添加@Qualifier注解,那么程序?qū)?bào)錯(cuò),這里通過@Qualifier注解來限定注入的值;該注解也可以設(shè)置value屬性。

2. 更多玩法

上面直接通過使用@Qualifier注解來限定注入值,接下來將介紹其它的使用方法。

2.1 自定義限定注解

@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Pack {
  String value();
}

自定義限定注解,該注解上使用了@Qualifier注解。接下來我們就可以使用該注解。

public class CommonService {
  @Resource
  @Pack
  private CommonDAO dao ;
}
@Bean
@Pack
public TeacherDAO teacherDAO() {
  return new TeacherDAO() ;
}

這時(shí)候你就可以自定義不同的注解分別標(biāo)準(zhǔn)你要注入的值。

2.2 泛型限定注入

有如下接口定義,該接口是泛型接口:

public class Teacher {}
public class Student {}
public interface CommonDAO<T> {}
public class TeacherDAO implements CommonDAO<Teacher> {}
public class StudentDAO implements CommonDAO<Student> {}
public class CommonService {
  @Resource
  private CommonDAO<Student> dao ;
  @Override
  public String toString() {
    return "CommonService [dao=" + dao + "]";
  }
}

在上面CommonDAO的注入中如果你泛型使用的Student那么注入的將是StudentDAO,如果是Teacher類型,那么注入的將是TeacherDAO。

泛型限定符也可用于List、Map 實(shí)例和數(shù)組。如下使用List示例:

@Resource
private List<CommonDAO<Student>> daos ;

這將注入容器中所有泛型是Student類型的CommonDAO實(shí)例對象。

2.3 完全自定義注解

有如下注解,我們完全可以不依賴任何Spring相關(guān)的注解實(shí)現(xiàn)限定的注入值。

@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Pack {
  String value() default "" ;
}

該自定義注解并沒有使用Spring的@Qualifier注解。要使得上面注解生效你還需要配置如下類:

@Bean
public CustomAutowireConfigurer customAutowireConfigurer() {
  CustomAutowireConfigurer autowireConfigurer = new CustomAutowireConfigurer() ;
  // 指定我們自定義的注解
  autowireConfigurer.setCustomQualifierTypes(Set.of(Pack.class)) ;
  return autowireConfigurer ;
}

CustomAutowireConfigurer是BeanFactoryPostProcessor,這會幫助我們注冊自定義的限定注解。

2.4 更多屬性控制

除了上面的方式限定注入的值,我們還可以自定義注解,指定更多的屬性值去匹配bean對象,只有bean對象具有相同的屬性值(元數(shù)據(jù)信息)才能匹配。

public enum Format {
  JSON, CSV, PLAIN
}
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Pack {
  String value() default "" ;
  // 指定格式
  Format format() ;
}
// Bean定義指定每一種bean對應(yīng)的格式format
@Pack(format = Format.CSV)
public class CSVDAO implements CommonDAO {}
@Pack(format = Format.JSON)
public class JSONDAO implements CommonDAO {}

接下來在注冊上面兩個(gè)*DAO bean時(shí)就不能通過注解的方式了,只能通過xml或者BeanDefinition的方式注冊,如下示例:

ApplicationContext context = ... ;
// 分別設(shè)置他們的元數(shù)據(jù)信息。
context.registerBean(CSVDAO.class, bd -> {
  bd.setAttribute("format", "CSV") ;
});
context.registerBean(JSONDAO.class, bd -> {
  bd.setAttribute("format", "JSON") ;
});

注入配置:

@Resource
@Pack(format = Format.JSON)
private CommonDAO dao ;

通過上面指定format屬性,以確定需要注入對象的明確要求。

責(zé)任編輯:武曉燕 來源: Spring全家桶實(shí)戰(zhàn)案例源碼
相關(guān)推薦

2019-01-29 10:00:59

GitHub開源搜索

2016-12-02 20:43:28

Android

2024-06-13 08:19:08

Controller接口參數(shù)

2024-08-06 09:51:21

SpringHTTPJSON

2021-03-03 08:05:53

C++項(xiàng)目函數(shù)

2024-07-10 11:26:18

2023-12-11 13:57:00

RFM模型激勵(lì)機(jī)制

2018-01-22 10:52:43

前端CSS追蹤用戶

2022-12-06 17:30:04

2022-07-30 23:45:09

內(nèi)存泄漏檢測工具工具

2021-02-01 13:35:28

微信Python技巧

2016-09-29 17:48:32

騰訊云語音質(zhì)檢珍愛網(wǎng)

2022-05-17 07:26:33

動畫CSS前端

2023-07-03 16:49:47

5G

2013-09-18 10:44:01

搜狗輸入法詞語

2023-12-29 08:17:20

接口類SpringAOP

2012-10-12 10:13:26

eclips代碼編寫Editplus

2013-08-22 10:28:50

.NET MVC.NETRazor

2022-08-12 08:25:33

Python異常信息代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品久久久久久久 | 欧美一级二级在线观看 | 国产精品成人一区二区三区吃奶 | 人操人人干人 | 欧美视频第三页 | 欧美在线视频一区二区 | 91精品在线播放 | 国产一区在线视频 | 久久精品国产免费看久久精品 | 第一av| 玖玖综合在线 | 成人精品国产一区二区4080 | xnxx 日本免费 | 国产成人久久精品一区二区三区 | 亚洲综合色婷婷 | 久久久高清| 国内在线视频 | 365夜爽爽欧美性午夜免费视频 | 国产精品亚洲成在人线 | 成人在线精品视频 | 久久久999成人 | 亚洲高清av在线 | 性做久久久久久免费观看欧美 | 国产成人在线一区二区 | 欧美日韩一| 免费观看黄色一级片 | 国产一区二区三区 | 亚洲成人国产精品 | 91精品国产乱码久久久久久久久 | 久久毛片 | 在线看免费的a | 亚洲一区二区在线视频 | 成人精品国产免费网站 | 中国人pornoxxx麻豆 | 久久久久国产一区二区三区 | 亚洲成av人片在线观看 | 亚洲综合无码一区二区 | 每日更新av | 成人精品一区亚洲午夜久久久 | 少妇一区在线观看 | 日韩欧美中文字幕在线观看 |