最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot如何通過Map實現(xiàn)策略模式

 更新時間:2025年03月27日 10:04:28   作者:一恍過去  
策略模式是一種行為設計模式,它允許在運行時選擇算法的行為,在Spring框架中,我們可以利用@Resource注解和Map集合來優(yōu)雅地實現(xiàn)策略模式,這篇文章主要介紹了SpringBoot如何通過Map實現(xiàn)策略模式,需要的朋友可以參考下

前言

策略模式是一種行為設計模式,它允許在運行時選擇算法的行為。在Spring框架中,我們可以利用@Resource注解和Map集合來優(yōu)雅地實現(xiàn)策略模式。

在Spring框架中,當你使用@Resource注解注入一個Map<String, T>時,Spring會自動將所有類型為T的bean收集到這個Map中,其中:

  • Key是bean的名稱
  • Value是bean實例

底層機制解析

Spring的集合類型自動裝配

Spring框架對集合類型的依賴注入有特殊處理:

  • 當注入List時,會收集所有類型為T的bean
  • 當注入Map<String, T>時,會收集所有類型為T的bean,并以bean名稱作為key

@Resource注解的行為

@Resource注解默認按名稱裝配,但當目標是一個Map時,Spring會特殊處理:

  • 如果Map的key是String類型,value是某個接口/類
  • Spring會查找所有實現(xiàn)該接口/繼承該類的bean
  • 將這些bean以"bean名稱->bean實例"的形式放入Map

實現(xiàn)原理

Spring在依賴注入時的處理流程:

  • 發(fā)現(xiàn)字段/方法參數(shù)是Map<String, T>類型
  • 在應用上下文中查找所有類型為T的bean
  • 創(chuàng)建一個新的Map實例
  • 遍歷找到的所有bean,以bean名稱作為key,bean實例作為value放入Map
  • 將這個Map注入到目標字段/參數(shù)中

使用

直接使用Map<String,T>

我們直接定義一個Controller,并且在Controller中使用@ResourceMap<String,T>

@RestController
@RequestMapping("/test")
public class TestController {
    @Resource
    private Map<String, Object> beanMap = new ConcurrentHashMap<>();
    public void beanMap() {
        System.out.println(beanMap.size());
    }
}

驗證:
可以看到map中存了項目中所有的bean對象

指定Map中的bean類型

在實際的開發(fā)中,我們希望Map中只是存儲需要的Bean,并且Controller中可以根據(jù)beanName進行轉發(fā)到不同的Service中,步驟如下:

定義策略接口

public interface PaymentStrategy {
    void pay();
}

定義實現(xiàn)類

@Service("ALI")
	@Slf4j
	public class AliStrategyService implements PaymentStrategy {
	    @Override
	    public void pay() {
	        log.info("使用支付寶支付");
	    }
	}
	@Service("WX")
	@Slf4j
	public class WxStrategyService implements PaymentStrategy {
	    @Override
	    public void pay() {
	        log.info("使用微信支付");
	    }
	}

策略使用

@RestController
@RequestMapping("/test")
public class TestController {
    @Resource
    private Map<String, PaymentStrategy> beanMap = new ConcurrentHashMap<>();
    public void beanMap() {
        PaymentStrategy wx = beanMap.get("WX");
        wx.pay();
        PaymentStrategy ali = beanMap.get("ALI");
        ali.pay();
    }
}

驗證

可以看到map中,就只有兩個Bean,并且key就是我們通過@Service(value)定義的名稱

自定義注解實現(xiàn)

自定義一個注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface PaymentType {
    String value();
}

注解替換:將原有的@Service(value)替換為@PaymentType (value),比如:

@PaymentType("CARD")
@Slf4j
public class CardStrategyService implements PaymentStrategy {
    @Override
    public void pay() {
        log.info("使用銀行卡支付");
    }
}

**意義:**可以更好表示策略模式,讓其他開發(fā)人員一眼可以看出當前的Service使用了策略模式

到此這篇關于SpringBoot通過Map實現(xiàn)天然的策略模式的文章就介紹到這了,更多相關SpringBoot策略模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Activiti開發(fā)環(huán)境的配置

    Activiti開發(fā)環(huán)境的配置

    本篇文章主要內容介紹了Activiti開發(fā)環(huán)境的配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Java線程創(chuàng)建(賣票),線程同步(賣包子)的實現(xiàn)示例

    Java線程創(chuàng)建(賣票),線程同步(賣包子)的實現(xiàn)示例

    這篇文章主要介紹了Java線程創(chuàng)建(賣票),線程同步(賣包子)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • IDEA操作MongoDB及安全認證方式

    IDEA操作MongoDB及安全認證方式

    這篇文章主要介紹了IDEA操作MongoDB及安全認證方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java RabbitMQ 中的消息長期不消費會過期嗎

    Java RabbitMQ 中的消息長期不消費會過期嗎

    RabbitMQ支持消息的過期時間,在消息發(fā)送時可以進行指定。 RabbitMQ支持隊列的過期時間,從消息入隊列開始計算,只要超過了隊列的超時時間配置,那么消息會自動的清除
    2021-09-09
  • 指定jdk啟動jar包的方法總結

    指定jdk啟動jar包的方法總結

    這篇文章主要給大家總結介紹了關于指定jdk啟動jar包的方法,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-07-07
  • 關于java.lang.IllegalArgumentException異常的正確解決方法

    關于java.lang.IllegalArgumentException異常的正確解決方法

    java.lang.IllegalArgumentException 是 Java 編程語言中的一個運行時異常,通常表示向方法傳遞了一個不合法或不適當?shù)膮?shù),本文給大家分享有關java.lang.IllegalArgumentException異常的正確解決方法,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • 總結十個實用但偏執(zhí)的Java編程技術

    總結十個實用但偏執(zhí)的Java編程技術

    Java是世界上最流行的程序語言,從1995年問世以來,Java的生態(tài)系統(tǒng)在一直在蓬勃的發(fā)展著。下面這篇文章主要總結了十個實用但偏執(zhí)的Java編程技術,需要的朋友可以參考借鑒,下面來一起學習學習吧。
    2017-01-01
  • java實現(xiàn)拼圖小游戲

    java實現(xiàn)拼圖小游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)拼圖小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Spring框架概述及核心設計思想分享

    Spring框架概述及核心設計思想分享

    Spring框架是一種開源的Java企業(yè)級應用開發(fā)框架,提供了IoC(控制反轉)容器和DI(依賴注入)等核心設計思想,SpringBoot則是在Spring基礎上進一步簡化配置,提供了快速開發(fā)、內置服務器等功能,學習Spring框架需要掌握容器、IoC和DI等概念,以及分層設計等軟件工程思想
    2025-02-02
  • Java中ModelMapper?的高級使用

    Java中ModelMapper?的高級使用

    本文主要介紹了Java中ModelMapper?的高級使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評論

都昌县| 衡水市| 正安县| 阿坝县| 盘山县| 南陵县| 梁平县| 婺源县| 正定县| 左贡县| 友谊县| 水富县| 抚州市| 墨脱县| 伊宁市| 彰化县| 合山市| 响水县| 拜泉县| 洪湖市| 高清| 隆子县| 盱眙县| 大城县| 陕西省| 威海市| 商河县| 时尚| 台前县| 遵义县| 柏乡县| 屯昌县| 冕宁县| 达州市| 新竹市| 黔西| 安溪县| 上犹县| 漠河县| 崇文区| 临汾市|