SpringBoot通过Map实现天然的策略模式

news/2025/3/30 5:03:55/
😊 @ 作者: 一恍过去
💖 @ 主页: https://blog.csdn.net/zhuocailing3390
🎊 @ 社区: Java技术栈交流
🎉 @ 主题: SpringBoot通过Map实现天然的策略模式
⏱️ @ 创作时间: 2025年03月25日

目录

  • 前言
  • 底层机制解析
    • Spring的集合类型自动装配
    • @Resource注解的行为
    • 实现原理
  • 使用
    • 直接使用Map<String,T>
    • 指定Map中的bean类型
      • 定义策略接口
      • 定义实现类
      • 策略使用
      • 验证
    • 自定义注解实现

前言

策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式

在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会查找所有实现该接口/继承该类的bean
  • 将这些bean以"bean名称->bean实例"的形式放入Map

实现原理

Spring在依赖注入时的处理流程:

  • 发现字段/方法参数是Map<String, T>类型
  • 在应用上下文中查找所有类型为T的bean
  • 创建一个新的Map实例
  • 遍历找到的所有bean,以bean名称作为key,bean实例作为value放入Map
  • 将这个Map注入到目标字段/参数中

使用

直接使用Map<String,T>

我们直接定义一个Controller,并且在Controller中使用@ResourceMap<String,T>

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

验证:
可以看到map中存了项目中所有的bean对象
在这里插入图片描述

指定Map中的bean类型

在实际的开发中,我们希望Map中只是存储需要的Bean,并且Controller中可以根据beanName进行转发到不同的Service中,步骤如下:

定义策略接口

public interface PaymentStrategy {void pay();
}

定义实现类

	@Service("ALI")@Slf4jpublic class AliStrategyService implements PaymentStrategy {@Overridepublic void pay() {log.info("使用支付宝支付");}}@Service("WX")@Slf4jpublic class WxStrategyService implements PaymentStrategy {@Overridepublic void pay() {log.info("使用微信支付");}}

策略使用

@RestController
@RequestMapping("/test")
public class TestController {@Resourceprivate 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)定义的名称
在这里插入图片描述
在这里插入图片描述

自定义注解实现

  • 自定义一个注解
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 {@Overridepublic void pay() {log.info("使用银行卡支付");}
}
  • **意义:**可以更好表示策略模式,让其他开发人员一眼可以看出当前的Service使用了策略模式

在这里插入图片描述


http://www.ppmy.cn/news/1583416.html

相关文章

夯实 kafka 系列|第三章:kafka 常用监控工具

文章目录 1.前言2.kafka 命令行工具3.kafka tools4.kafka-ui&#xff08;推荐&#xff09;5.实用功能5.1 消息查找5.1.1 kafka-ui5.1.2 kafka tools 5.2 手动添加 1.前言 本章主要是介绍一些工作中常用 kafka 的监控工具&#xff1b;原理上都是一样的&#xff0c;只是展现方式…

web爬虫笔记:js逆向案例十一 某数cookie(补环境流程)

web爬虫笔记:js逆向案例十一 某数cookie(补环境流程) 一、获取网页数据请求流程 二、目标网址、cookie生成(逐步分析) 1、目标网址:aHR0cHM6Ly9zdWdoLnN6dS5lZHUuY24vSHRtbC9OZXdzL0NvbHVtbnMvNy9JbmRleC5odG1s 2、快速定位入口方法 1、通过脚本监听、hook_cookie等操作可…

第一章:优化概述_《C++性能优化指南》notes

优化概述 第一章核心知识点详解1. 性能优化的必要性2. 编译器优化选项3. 减少内存分配总结 第一章重点内容回顾第一部分&#xff1a;多项选择题第二部分&#xff1a;程序设计题&#xff08;5题&#xff09;答案及详解多选题答案&#xff1a; 程序设计题答案示例1. 优化字符串类…

WordPress自动代码高亮插件Code Prettify插件

一、插件介绍 Code Prettify 是一款轻量级的 WordPress 代码高亮插件,由 Google 开发,专为在网页上美化代码显示而设计。它支持多种编程语言,能够自动检测代码并进行语法高亮,无需手动添加标签。 该插件适用于技术博客、开发者文档站点以及任何需要展示代码的 WordPress …

编译原理 pl0 词法解析器 使用状态机与状态矩阵,和查找上一步得到分析

状态机练习 编译原理 状态机识别标识符-CSDN博客 大体思路是先区分数字&#xff0c;标识符&#xff0c;然后标识符再区分保留字这样。 随后根据PL0 字符改状态机 改了3次才出来 状态矩阵&#xff0c;一行一行写 input.txt const a10; var b,c;beginread(b);c:ab;write(c)en…

pyqt5报错:qt.qpa.plugin: Could not find the Qt platform plugin “xcb“(已解决)

我在使用pyqt库的时候报错&#xff1a; qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in \ "/mnt/private_disk/anaconda3/envs/aot-manip/lib/python3.8/site-packages/PyQt5/Qt5/plugins/platforms" even though it was found. This ap…

用Python爬取图片的两种姿势:从静态到动态的完整攻略(二)

一、前言 在前文中,我们详细介绍了 BeautifulSoup 这一工具。在处理静态数据爬取任务时,它确实展现出了快捷、方便的特性,能够高效地完成相关工作。然而,当前市面上诸多规范运营的网站,为了保障自身数据安全与运营秩序,纷纷采取了一系列反爬虫措施。 这些措施不仅涵盖了…

探索未来世界:元宇宙、虚拟现实与增强现实的交互新体验

在数字化浪潮不断推进的今天&#xff0c;元宇宙、虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;正以其独特的魅力吸引着全球的关注。这些技术不仅颠覆了传统的交互方式&#xff0c;还为游戏、教育、社交和商业等领域带来了全新的体验和无限可能。本…