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

在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數據分布式

2011-06-03 11:53:06

Spring接口

2024-12-18 16:19:51

2025-02-27 00:00:30

SpringJava方式

2025-02-03 09:00:00

API接口性能

2025-01-21 10:04:40

Java并發阻塞隊列

2011-07-22 17:22:20

Spring

2023-06-01 16:45:11

React開發JavaScript

2023-05-10 13:58:13

服務限流系統

2012-08-22 10:32:34

2022-03-23 12:55:50

農業物聯網

2019-05-15 08:00:00

vue組件間通信前端

2009-02-11 09:46:00

ASON網絡演進

2016-05-10 14:38:13

大數據企業

2023-04-26 08:41:16

Git撤消更改

2025-04-29 08:21:30

ANRAndroidUI

2019-05-16 13:00:18

異步編程JavaScript回調函數

2024-08-30 11:11:01

2022-03-28 20:57:31

私有屬性class屬性和方法

2023-08-15 15:44:55

React開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线播放中文字幕 | 岛国av免费观看 | 欧美一二三四成人免费视频 | 欧美一区二区三区四区视频 | 国产精品中文字幕一区二区三区 | 97精品久久 | 亚洲成人网在线播放 | 国产精品免费av | 四虎永久免费影院 | 一区二区三区四区日韩 | 精品国产欧美一区二区三区成人 | 久久的色 | 午夜婷婷激情 | 黄色网址在线免费观看 | 日韩成人精品视频 | 中文字幕一区二区三区精彩视频 | 久久久久成人精品 | 日韩精品一区二区三区中文在线 | 一区二区三区亚洲 | 色成人免费网站 | 一区二区三区av夏目彩春 | 日韩手机在线看片 | 日本成人福利 | 一区二区三区av | 国产在线一区二区三区 | 曰韩一二三区 | 成人免费网站在线 | 尤物在线视频 | 日韩精品一区二区在线 | 丁香五月网久久综合 | h在线免费观看 | 国产最新网址 | 亚洲免费视频网站 | 91精品麻豆日日躁夜夜躁 | 欧美日韩国产在线观看 | 久草精品在线 | 国产在线精品一区二区 | 精品一区二区三区在线视频 | 午夜精品久久久久久久久久久久 | 精品亚洲一区二区三区 | 国产精品久久久久久久久久久久久 |