成人免费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數據分布式

2024-12-18 16:19:51

2011-06-03 11:53:06

Spring接口

2025-02-27 00:00:30

SpringJava方式

2019-05-16 13:00:18

異步編程JavaScript回調函數

2011-07-22 17:22:20

Spring

2025-02-03 09:00:00

API接口性能

2025-01-21 10:04:40

Java并發阻塞隊列

2017-06-26 10:35:58

前端JavaScript繼承方式

2022-03-28 20:57:31

私有屬性class屬性和方法

2023-06-01 16:45:11

React開發JavaScript

2023-08-15 15:44:55

React開發

2022-12-06 10:39:43

Spring事務失效

2024-08-30 11:11:01

2023-05-10 13:58:13

服務限流系統

2012-08-22 10:32:34

2022-03-23 12:55:50

農業物聯網

2020-07-31 11:12:39

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

2022-01-14 10:34:50

黑客隱藏蹤跡網絡安全

2020-04-27 09:00:00

雙因素認證身份認證生物識別
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品在线免费 | 一级黄色毛片子 | 日韩欧美专区 | 国产97色 | 人成精品 | 久久免费视频观看 | 午夜免费电影院 | 日韩欧美精品在线 | 亚洲综合伊人 | 成人在线播放 | 欧美成人自拍视频 | 超碰导航 | 欧美极品在线视频 | 亚洲免费高清 | 久国久产久精永久网页 | 久久综合九九 | 欧美日韩高清免费 | 欧美不卡 | 国产高清免费 | 午夜精品 | 亚洲一区二区免费视频 | 国产精品不卡 | 在线国产一区二区 | 国产精品福利视频 | 91在线精品一区二区 | 亚洲成人网在线播放 | 一区二区精品 | 一区二区日本 | 久久综合九九 | 色综合成人网 | 亚洲一区不卡 | 亚洲区一区二 | 国产激情一区二区三区 | 草草网 | 拍拍无遮挡人做人爱视频免费观看 | 婷婷中文在线 | 特黄视频 | 色就干 | 成人在线观看欧美 | 欧美一级欧美三级在线观看 | 免费国产一区二区 |