欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

在Spring框架中,當(dāng)你使用@Resource注解注入一個(gè)Map<String, T>時(shí),Spring會(huì)自動(dòng)將所有類型為T的bean收集到這個(gè)Map中,其中:

  • Key是bean的名稱
  • Value是bean實(shí)例

底層機(jī)制解析

Spring的集合類型自動(dòng)裝配

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

  • 當(dāng)注入List時(shí),會(huì)收集所有類型為T的bean
  • 當(dāng)注入Map<String, T>時(shí),會(huì)收集所有類型為T的bean,并以bean名稱作為key

@Resource注解的行為

@Resource注解默認(rèn)按名稱裝配,但當(dāng)目標(biāo)是一個(gè)Map時(shí),Spring會(huì)特殊處理:

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

實(shí)現(xiàn)原理

Spring在依賴注入時(shí)的處理流程:

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

使用

直接使用Map<String,T>

我們直接定義一個(gè)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());
    }
}

驗(yàn)證:
可以看到map中存了項(xiàng)目中所有的bean對(duì)象

指定Map中的bean類型

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

定義策略接口

public interface PaymentStrategy {
    void pay();
}

定義實(shí)現(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();
    }
}

驗(yàn)證

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

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

自定義一個(gè)注解

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ā)人員一眼可以看出當(dāng)前的Service使用了策略模式

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

相關(guān)文章

  • Spring Data JPA實(shí)現(xiàn)動(dòng)態(tài)條件與范圍查詢實(shí)例代碼

    Spring Data JPA實(shí)現(xiàn)動(dòng)態(tài)條件與范圍查詢實(shí)例代碼

    本篇文章主要介紹了Spring Data JPA實(shí)現(xiàn)動(dòng)態(tài)條件與范圍查詢實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-06-06
  • springboot配合Thymeleaf完美實(shí)現(xiàn)遍歷功能

    springboot配合Thymeleaf完美實(shí)現(xiàn)遍歷功能

    Thymeleaf顯然是一個(gè)開發(fā)頁面的技術(shù),現(xiàn)在各種前端技術(shù)層出不窮,比如現(xiàn)在主流的Vue、React、AngularJS等。這篇文章主要介紹了springboot配合Thymeleaf完美實(shí)現(xiàn)遍歷,需要的朋友可以參考下
    2021-09-09
  • Java NIO異步文件通道原理及用法解析

    Java NIO異步文件通道原理及用法解析

    這篇文章主要介紹了Java NIO異步文件通道原理及用法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java8中List轉(zhuǎn)Map的多種方式代碼

    Java8中List轉(zhuǎn)Map的多種方式代碼

    這篇文章主要給大家介紹了關(guān)于Java8中List轉(zhuǎn)Map的多種方式,在實(shí)際項(xiàng)目中我們經(jīng)常會(huì)用到List轉(zhuǎn)Map操作,本文介紹了多種方法的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2023-08-08
  • 實(shí)例詳解SpringBoot默認(rèn)的JSON解析方案

    實(shí)例詳解SpringBoot默認(rèn)的JSON解析方案

    JSON數(shù)據(jù)現(xiàn)在是我們開發(fā)中用的最多的,百分之九十的數(shù)據(jù)都是通過JSON方式進(jìn)行傳輸,下面這篇文章主要給大家介紹了關(guān)于SpringBoot默認(rèn)的JSON解析方案的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • java?Date獲取本月的開始時(shí)間與結(jié)束時(shí)間

    java?Date獲取本月的開始時(shí)間與結(jié)束時(shí)間

    這篇文章主要為大家介紹了java?Date獲取本月的開始時(shí)間與結(jié)束時(shí)間示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2023-05-05
  • SpringBoot如何IDEA中實(shí)現(xiàn)熱部署

    SpringBoot如何IDEA中實(shí)現(xiàn)熱部署

    這篇文章主要介紹了SpringBoot如何IDEA中實(shí)現(xiàn)熱部署,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • C語言指針數(shù)組案例詳解

    C語言指針數(shù)組案例詳解

    這篇文章主要介紹了C語言指針數(shù)組案例詳解,本文通過案例詳細(xì)的解釋了指針與數(shù)組的初始化還有關(guān)系與應(yīng)用,需要的朋友可以參考下這篇文章
    2021-07-07
  • 使用Springboot根據(jù)配置文件動(dòng)態(tài)注入接口實(shí)現(xiàn)類

    使用Springboot根據(jù)配置文件動(dòng)態(tài)注入接口實(shí)現(xiàn)類

    這篇文章主要介紹了使用Springboot根據(jù)配置文件動(dòng)態(tài)注入接口實(shí)現(xiàn)類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Mybatis執(zhí)行update失敗的解決

    Mybatis執(zhí)行update失敗的解決

    這篇文章主要介紹了Mybatis執(zhí)行update失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論