国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

在Spring Boot中具有多個實現的接口正確注入組件的六種方式

開發 前端
通常,當我們有多個接口實現并嘗試將該接口自動注入到組件中時,會遇到一個錯誤——“需要單個bean,但找到了X個”。原因很簡單:Spring不知道我們想要在該組件中使用哪個實現類。不過,Spring對于這種情況還是提供了多種方式來讓我們更具體地指定所需要的類。

環境:Spring Boot3.2.5

1. 簡介

本篇文章,我們將探討學習在 Spring Boot 中自動裝配時當一個接口有多個實現時如何選擇正確的實現類進行注入。這是一項強大的功能,允許開發人員將接口的不同實現動態注入應用程序中。

通常,當我們有多個接口實現并嘗試將該接口自動注入到組件中時,會遇到一個錯誤——“需要單個bean,但找到了X個”。原因很簡單:Spring不知道我們想要在該組件中使用哪個實現類。不過,Spring對于這種情況還是提供了多種方式來讓我們更具體地指定所需要的類。

接下來,我將詳細的介紹6種實現方式。

2. 實戰案例

2.1 準備環境

首先,定義一個接口DAO

public interface DAO<T> {
  List<T> queryList() ;
}

接下來,定義2個實現類

public class MySQLDAO implements DAO<User> {
  @Override
  public List<User> queryList()
    // TODO
  }
}
public class OracleDAO implements DAO<User> {
  @Override
  public List<Date> queryList() {
    // TODO
  }
}

這里針對DAO接口,定義了2個接口實現,接下來的案例中我們將圍繞這2個進行講解。

2.2 使用@Qualifier注解

使用@Qualifier注解,我們可以在多個實現類中指定要自動裝配哪個bean。我們可以將其應用于組件本身,為其提供一個自定義的限定符名稱,如下示例:

@Repository
@Qualifier("mysqlDAO-1")
public class MySQLDAO implements DAO<User> {}
@Repository
public class OracleDAO implements DAO<User> {}

這里2個實現使用@Repository注冊為bean,其中MySQLDAO實現使用了@Qualifier限定了bean名稱。接下來,在注入時,我們就可以使用@Qualifier來限定注入的bean

@Component
public class CompDAO {


  private final DAO dao1 ;
  private final DAO dao2 ;
  public CompDAO(
    @Qualifier("mysqlDAO-1") DAO dao1, 
    DAO oracleDAO) {
    this.dao1 = dao1 ;
    this.dao2 = dao2 ;
  }
}

需要注意的是,這里的第二個DAO參數并沒有添加@Qualifier注解,它也能正確的注入,這是因為默認情況Spring會按照名稱進行裝配(確保定義bean的名稱與你這參數名稱一致)。

2.3 使用@Primary注解

此外,我們還可以用 @Primary 來注解其中一個實現。如果有多個候選實現,且按參數名或限定符自動裝配不適用,Spring 將使用該實現:

@Repository
@Primary
public class OracleDAO implements DAO<User> {}

當我們經常使用其中一種實現時,此種方式就會非常有用,這非常有助于避免出現 如下的錯誤信息:

圖片圖片

在這種情況下如果你還需要使用其它的實現,你可以通過ApplicationContext#getBean手動方式來獲取。

2.4 使用@Profile注解

可以使用Spring的配置文件(profiles)來決定要自動裝配哪個組件。如上示例,我們可以讓OracleDAO實現僅在生產環境配置文件(prod profile)下激活,而MySQLDAO僅在開發環境配置文件(dev profile)下激活,如下示例:

@Repository
@Profile("dev")
public class MySQLDAO implements DAO<User> {}
@Repository
@Profile("prod")
public class OracleDAO implements DAO<User> {}

具體哪個會生效,就看你當前環境配置的spring.profiles.active屬性是dev還是prod了。

2.5 所有實現裝配到集合中

我們可以將特定類型的所有可用 Bean 注入到一個集合中,如下示例:

@Component
public class CompDAO {


  private final List<DAO> daos ;
  public CompDAO(List<DAO> daos) {
    this.daos = daos ;
  }
}

此外,我們還可以將實現自動裝配到Set、Map或Array中。使用Map時,格式通常是 Map<String, DAO>,其中鍵是 Bean 的名稱,值是 Bean 實例本身,如下示例:

@Component
public class CompDAO {
  private final Map<String, DAO> daos ;
  public CompDAO(Map<String, DAO> daos) {
    this.daos = daos ;
  }
  
  public void use() {
    MySQLDAO mdao = this.daos.get("mySQLDAO") ;
    OracleDAO odao = this.daos.get("oracleDAO") ;
    // TODO
  }
}

注意:此時Spring不會考慮限定符或參數名稱。它會忽略注釋為 @Profile 的、與當前配置文件不匹配的 Bean。

2.6 使用@Priority注解

我們還可以使用jakarta.annotation.Priority注解,為每一個實現類定義優先級,該注解有一個Integer類型的參數,值越小優先級越高,當存在多個類型的優先級越高的會被優先注入,如下示例:

@Repository
@Priority(2)
public class OracleDAO implements DAO<Date> {}
@Repository
@Priority(1)
public class MySQLDAO implements DAO<Date> {}

如上示例,由于MySQLDAO設置優先級最小,所以注入的將是MySQLDAO。

2.7 自定義Condition

為了更精確地確定哪個 bean 成為自動裝配的候選者,我們可以使用 @Conditional 注解對它們進行標注。@Conditional 注解應該有一個參數,該參數是一個實現了 Condition 接口(它是一個函數式接口)的類,如下示例:

public class PackCondition implements Condition {
  @Override 
  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    return context.getEnvironment()
      .getProperty("pack.active")
      .toLowerCase()
      .equals("mysql") ;
  } 
}

使用

@Repository
@Conditional(PackCondition.class) 
public class MySQLDAO implements DAO<User> {
  // ...
}

在上面的示例中,只有配置文件的pack.active屬性設置為mysql(matches方法返回true)時才會創建MySQLDAO。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2024-05-30 08:51:28

Spring數據分布式

2024-12-18 16:19:51

2011-06-03 11:53:06

Spring接口

2019-05-16 13:00:18

異步編程JavaScript回調函數

2011-07-22 17:22:20

Spring

2017-06-26 10:35:58

前端JavaScript繼承方式

2022-03-28 20:57:31

私有屬性class屬性和方法

2025-02-27 00:00:30

SpringJava方式

2025-02-03 09:00:00

API接口性能

2023-08-15 15:44:55

React開發

2024-08-30 11:11:01

2022-12-06 10:39:43

Spring事務失效

2025-01-21 10:04:40

Java并發阻塞隊列

2023-06-01 16:45:11

React開發JavaScript

2020-07-31 11:12:39

安全威脅網絡攻擊網絡安全

2022-01-14 10:34:50

黑客隱藏蹤跡網絡安全

2020-04-27 09:00:00

雙因素認證身份認證生物識別

2023-05-10 13:58:13

服務限流系統

2012-08-22 10:32:34

2025-07-08 08:20:39

點贊
收藏

51CTO技術棧公眾號

日韩欧美国产麻豆| 日韩一区二区三区四区五区| 波多视频一区| 国产精品初高中害羞小美女文| 成人xvideos免费视频| 电影91久久久| 欧美激情亚洲精品| 精品人伦一区二区三区蜜桃免费| 欧美一级二级三级蜜桃| 欧美久久久久久久久久久久久久| 久久精品国产一区二区| 日韩欧美在线网站| caoliu在线| 亚洲靠逼com| 日韩一级理论片| 99热99精品| 六十路精品视频| 最新国产精品精品视频| 啊v视频在线一区二区三区| 久久久国产精品| 亚洲国产精品久久久久婷婷老年 | 久久精品国产v日韩v亚洲 | 午夜精品一区二区三区在线播放| 深夜国产在线播放| 亚洲第一色在线| 黄网在线免费看| 色综合久久综合网| 第九色区av在线| 日韩一区二区三| heyzo一区| 欧美一级国产精品| 超碰电影在线播放| 日韩三级视频在线观看| 亚洲大片精品免费| 国产激情片在线观看| 国产大片一区| 成人淫片免费视频95视频| 亚洲福利视频网站| 一区二区三区视频在线观看免费| 亚洲韩国欧洲国产日产av | 精品二区久久| av网站在线看| 欧洲xxxxx| 欧美a级片网站| 樱花草国产18久久久久| 亚洲精品自拍网| 国产午夜精品久久| 99草草国产熟女视频在线| 久久影院电视剧免费观看| 欧美v在线观看| 国产精品拍天天在线| 欧美a级一区| 精品国产一区二区三| 国产精品视频在线观看| 欧美人成在线观看ccc36| 久久久久久久欧美精品| 欧美激情视频免费看| 国产一区二区在线视频| 亚洲乱码日产精品bd在线观看| 国内精品一区二区三区四区| 绿色成人影院| 在线播放国产一区二区三区| 亚洲香蕉久久| 欧美亚洲成人网| 91精品久久久久久久蜜月| 中文一区二区| 亚洲国产精品福利| 免费日韩成人| 欧美专区中文字幕| 永久91嫩草亚洲精品人人| 欧美日韩免费精品| 成人精品国产福利| 女同互忝互慰dv毛片观看 | 国产精品自产拍在线观看中文| 亚洲成人av| 日本一区二区高清视频| 成人免费视频播放| 看黄色免费网站| 日韩欧美电影一二三| 日韩最新av| 好吊妞www.84com只有这里才有精品 | 久久精品动漫| 欧美日韩国产精品激情在线播放| 中文av字幕一区| 成人18在线| 亚洲欧洲高清在线| 香蕉久久精品日日躁夜夜躁| 国产在线播放一区二区| 99综合电影在线视频| 黄色在线播放| 伦伦影院午夜日韩欧美限制| 欧美激情成人在线| youjizz.com在线观看| 亚洲黄色在线视频| 亚洲小说区图片| 97欧美精品一区二区三区| 免费看亚洲片| 丁香婷婷激情| 国产视频丨精品|在线观看| 日产午夜精品一线二线三线| 成人污网站在线观看| 欧美在线免费观看视频| 超碰97久久| 亚洲AV无码成人精品一区| 欧美香蕉大胸在线视频观看| 国产精品欧美一区二区三区不卡| 九9re精品视频在线观看re6| 中文字幕在线观看一区| 三级在线看中文字幕完整版| 成人影片在线播放| 亚洲欧美aⅴ...| 激情久久99| 亚洲一区二区免费视频软件合集| 亚洲一区二区在线免费看| 亚洲人体在线| 亚洲欧美国产精品桃花| 在线精品国精品国产尤物884a| 成人看片爽爽爽| 日韩在线观看a| 日韩三级在线免费观看| av资源久久| 手机视频在线观看| 亚洲男人的天堂在线播放| 99精品福利视频| 亚洲综合色视频在线观看| 久久久久久久久久婷婷| 盗摄精品av一区二区三区| av毛片在线| 电影午夜精品一区二区三区| 亚洲一区二区免费视频| 青青视频一区二区| 国产乱人伦精品一区二区三区| 日韩欧美自拍偷拍| 激情久久综合| 精品999视频| 国产在线精品成人一区二区三区| 中文字幕人成不卡一区| 成人线上播放| 三级4级全黄60分钟| www.欧美精品| jiyouzz国产精品久久| 在线天堂资源www在线污| 午夜老司机精品| 色爱综合网站| 欧美一级理论片| 99精品国产福利在线观看免费| 中文字幕一二三区在线观看 | 国产乱视频在线观看| 国产精品久久久久久久久久久新郎 | 亚洲第一中文av| 欧美另类在线观看| www激情久久| 天堂久久一区| 日韩欧美视频网站| 久久精品视频中文字幕| 99视频有精品| 精品国产亚洲一区二区三区| 福利视频一二区| 国产一区二区三区日韩欧美| 韩国精品一区二区| 不卡福利视频| 日韩精品一区二区三区电影| 亚洲欧美日韩区| 国产成人激情av| 亚洲日日夜夜| www亚洲成人| 日本精品久久电影| 亚洲午夜一区二区| 欧美日韩国产高清| 麻豆视频在线观看免费网站| 日韩高清国产一区在线观看| 日韩av中文字幕在线播放| 国产98色在线|日韩| 444亚洲人体| 91精品国产综合久久香蕉| 国产美女在线免费观看| 欧美成年人网站| 欧美日韩有码| 国产精品qvod| 黄色日韩精品| 欧美aaaaaaaaaaaa| 亚洲在线国产日韩欧美| 欧美淫片网站| 日韩成人精品一区| 欧美日韩调教| 视频一区欧美| 欧美日韩大片免费观看| 亚洲综合图色| 亚洲综合欧美在线| 国产在线久久久| 678五月天丁香亚洲综合网| 喷水一区二区三区| 欧美天堂一区| 成人福利视频导航| 欧美日本韩国一区二区三区| 深夜精品寂寞黄网站在线观看| 亚洲美女一区| 日韩一区二区三区电影在线观看| 91av在线免费观看| 国产综合18久久久久久|