Spring通過註解註入組件的方法

来源:https://www.cnblogs.com/bigshark/archive/2019/07/31/11273713.html
-Advertisement-
Play Games

組件聲明 在類上聲明 @Component、@Configuration、@RestController、@Service、@Repository 等註解,表示這個類需要被註入IoC容器。 1、@Configuration 和 @Bean @Configuration 常用來和 @Bean 配合使用 ...


組件聲明

在類上聲明 @Component、@Configuration、@RestController、@Service、@Repository 等註解,表示這個類需要被註入IoC容器。

1、@Configuration 和 @Bean

@Configuration 常用來和 @Bean 配合使用,來註入第三方組件。

例子:註入 Druid 數據源

@Configuration
public class DruidConfig {
  @Bean
  @ConfigurationProperties(prefix = "spring.datasource")
  public DataSource druidDataSource() {
    return new DruidDataSource();
  }
}

2、FactoryBean

通過實現介面 FactoryBean 來註入

例子:利用 FactoryBean 註入 Dog

// 實現 FactoryBean
public class DogFactoryBean implements FactoryBean<Dog> {

  // 對象
  @Override
  public Dog getObject() throws Exception {
    return new Dog();
  }

  // 類型
  @Override
  public Class<?> getObjectType() {
    return Dog.class;
  }

  // 是否單例,true表示是單例
  @Override
  public boolean isSingleton() {
    return true;
  }
}
// 註入 DogFactoryBean
@Configuration
public class MyConfig {
  @Bean
  DogFactoryBean dog() {
    return new DogFactoryBean();
  }
}

通過名字 dog 可以獲取容器中的 Dog 對象;如果想獲取 DogFactoryBean 對象,可以用 &dog 來獲取。

3、@Import

在類上聲明,可以快速註入多個第三方的類,常配合 ImportSelector、ImportBeanDefinitionRegistrar 使用

例子:註入 Dog、Cat 類
方式 1:註解註入

@Import({Dog.class, Cat.class})
public class MyConfig {}

方式 2:實現介面 ImportSelector

// 實現 ImportSelector
public class MyImport implements ImportSelector {
  @Override
  public String[] selectImports(AnnotationMetadata metadata) {
    return new String[]{"com.xxx.Dog", "com.xxx.Cat"};
  }
}
// 導入 MyImport
@Import({MyImport.class})
public class MyConfig {}

方式 3:實現介面 ImportBeanDefinitionRegistrar

// 實現 ImportBeanDefinitionRegistrar
public class MyImportBean implements ImportBeanDefinitionRegistrar {
  @Override
  public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
    BeanDefinition dogBean = new RootBeanDefinition(Dog.class);
    registry.registerBeanDefinition("dog", dogBean);
    BeanDefinition catBean = new RootBeanDefinition(Cat.class);
    registry.registerBeanDefinition("cat", beanDefinitions);
  }
}
// 導入 MyImportBean
@Import({MyImportBean.class})
public class MyConfig {}

4、@Conditional

可以自定義滿足條件後才註入組件。

例子:當容器中存在 Dog 時,才註入 Cat

// 實現 Condition
public class MyCondition implements Condition {
  @Override
  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    for (String name : Objects.requireNonNull(context.getBeanFactory()).getBeanDefinitionNames()) {
      if ("com.xxx.Dog".equals(name)) {
        return true;
      }
    }
    return false;
  }
}
// 按條件註入 Cat
@Configuration
public class MyConfig {
    @Conditional(MyCondition.class)
    @Bean
    Cat cat() {
        return new Cat();
    }
}

Springboot 提供了一些 @Conditional 的實現

@ConditionalOnClass:存在該類時生效
@ConditionalOnBean:存在該Bean是生效
@ConditionalOnProperty:配置正確時生效
@ConditionalOnResource:資源存在是生效

5、其它註解

Springboot 提供的配置生效順序的註解

@AutoConfigureAfter:在指定的配置類生效後再註入
@AutoConfigureBefore:在指定的配置類生效後再註入

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Web前端三大框架_angular.js 6.0(一) 需要視頻教程,看頭像昵稱處 一、Angular 6.0 1.1樣式 html中引入樣式:內嵌式,外鏈式,行內式。 ng6中組件引入樣式的方式也有三種: 外鏈式 ng6中,已經將css預編譯語言配置出來了,因此我們可以直接使用他們 在組件註解類中 ...
  • 隊列與棧不同,它遵從先進先出(FIFO——First In First Out)原則,新添加的元素排在隊列的尾部,元素只能從隊列頭部移除。 我們在前一篇文章中描述瞭如何用JavaScript來實現棧這種數據結構,這裡我們對應地來實現隊列。 與棧的實現方式類似,唯一不同的是從隊列移除元素時取的是隊列頭 ...
  • CSS3動畫animation的學習筆記,包括animation的屬性及其值的設定,以及keyframes的值的設定方法 ...
  • 1、面向對象特點:封裝、繼承、多態。2、構造函數 = 構造器 + 原型對象;(1)父類function UserClass(name,age,word){ //構造器 constructor this.name=name; this.age =age; this.word =word; this.i ...
  • 前言 上一節我們說了介面隔離原則,就是讓介面的職責最小化。這樣對維護代碼簡單,調用方法也清晰。 這節我們來研究依賴倒置原則。這個原則我認為是特別特別重要的。在很多地方我們能看到。比如Dubbo中使用到的SPI等等。 基本介紹 什麼是依賴倒置原則? 我們可以將其分為兩點: 1) 高層模塊不應該依賴低層 ...
  • 官網:www.fhadmin.org 特別註意: Springboot 工作流 前後分離 + 跨域 版本 (許可權控制到菜單和按鈕) 後臺框架:springboot2.1.2+ activiti6.0.0+ mybaits+maven+介面 前端頁面:html +vue.js 形式 jquery aj ...
  • ​ 這篇文章我們來學習如何使用 Spring Boot 集成 Apache Shiro 。安全應該是互聯網公司的一道生命線,幾乎任何的公司都會涉及到這方面的需求。在 Java 領域一般有 Spring Security、 Apache Shiro 等安全框架,但是由於 Spring Security ...
  • RocketMQ中通過DefaultMQProducer創建Producer DefaultMQProducer定義如下: 其中defaultMQProducerImpl成員是Producer的具體實現,其餘的一些成員是對一些參數的設置:createTopicKey:是一個Topic值,在創建時使用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...