Spring Boot 中应用的设计模式

news2025/4/15 19:36:24

Spring Boot 中应用的设计模式详解

Spring Boot 作为 Spring 框架的扩展,广泛使用了多种经典设计模式。以下是主要设计模式及其在 Spring Boot 中的具体应用:

一、创建型模式

1. 工厂模式 (Factory Pattern)

  • 应用场景
    • BeanFactoryApplicationContext 核心接口
    • @Bean 注解的方法本质是工厂方法
  • 示例
    @Configuration
    public class AppConfig {
        @Bean
        public DataSource dataSource() { // 工厂方法
            return new HikariDataSource();
        }
    }
    

2. 单例模式 (Singleton Pattern)

  • 实现方式
    • Spring 容器默认将所有 bean 作为单例管理
    • 通过 @Scope("singleton") 显式声明
  • 特点
    • 单例存储在 DefaultSingletonBeanRegistrysingletonObjects Map 中
    • 非线程安全对象需配合 ThreadLocal 使用

3. 建造者模式 (Builder Pattern)

  • 典型应用
    • RestTemplateBuilder
    • SpringApplicationBuilder
  • 示例
    new RestTemplateBuilder()
        .rootUri("https://api.example.com")
        .defaultHeader("Authorization", "Bearer token")
        .build();
    

二、结构型模式

4. 代理模式 (Proxy Pattern)

  • 实现形式
    • JDK 动态代理(基于接口)
    • CGLIB 代理(基于类继承)
  • 应用场景
    • AOP 实现(@Transactional 等)
    • @Cacheable 缓存代理
  • 核心类
    • ProxyFactory
    • AopProxy

5. 装饰器模式 (Decorator Pattern)

  • 典型应用
    • HttpServletRequestWrapper 请求包装
    • Spring Cache 的 TransactionAwareCacheDecorator
  • 特点
    • 在不改变接口的情况下增强功能

6. 适配器模式 (Adapter Pattern)

  • 应用场景
    • Spring MVC 的 HandlerAdapter
    • RequestMappingHandlerAdapter 处理不同控制器类型
    • AOP 中的 MethodInterceptor 适配各种通知类型

三、行为型模式

7. 模板方法模式 (Template Method)

  • 典型实现
    • JdbcTemplate / RestTemplate
    • AbstractController 基类
  • 特点
    public class JdbcTemplate {
        public <T> T query(String sql, ResultSetExtractor<T> rse) {
            // 固定流程:获取连接→创建语句→执行查询→处理结果→释放资源
            Connection con = DataSourceUtils.getConnection(obtainDataSource());
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            return rse.extractData(rs); // 可变部分委托给回调接口
        }
    }
    

8. 观察者模式 (Observer Pattern)

  • 实现机制
    • ApplicationEvent 事件体系
    • @EventListener 注解
  • 示例
    // 定义事件
    public class OrderEvent extends ApplicationEvent { ... }
    
    // 发布事件
    applicationContext.publishEvent(new OrderEvent(this, order));
    
    // 监听事件
    @EventListener
    public void handleOrderEvent(OrderEvent event) { ... }
    

9. 策略模式 (Strategy Pattern)

  • 应用场景
    • 多数据源切换 (AbstractRoutingDataSource)
    • 缓存管理器 (CacheManager 接口的不同实现)
    • 认证策略 (AuthenticationProvider 体系)

四、组合使用的高级模式

10. 组合模式 (Composite Pattern)

  • 应用案例
    • CompositeCacheManager 组合多个缓存管理器
    • Spring Security 的 SecurityFilterChain

11. 责任链模式 (Chain of Responsibility)

  • 典型实现
    • Spring Security 过滤器链
    • HandlerExecutionChain 处理请求

12. 门面模式 (Facade Pattern)

  • 代表实现
    • SpringApplication 类封装启动复杂度
    • JdbcTemplate 隐藏原生JDBC复杂性

五、Spring Boot 特有模式应用

13. 条件化配置 (Conditional)

  • 实现机制
    • @Conditional 系列注解
    • 自动配置的核心模式 (AutoConfigurationImportSelector)
  • 示例
    @Configuration
    @ConditionalOnClass(DataSource.class)
    public class DataSourceAutoConfiguration { ... }
    

14. 约定优于配置 (Convention over Configuration)

  • 体现方面
    • 默认属性配置 (application.properties 自动加载)
    • 静态资源默认路径 (/static, /public)

六、设计模式在自动配置中的综合应用

Spring Boot 自动配置是多种模式的完美结合:

  1. 工厂模式:通过 @EnableAutoConfiguration 触发配置类加载
  2. 策略模式AutoConfigurationImportSelector 选择配置策略
  3. 条件判断@Conditional 系列注解控制bean创建
  4. 装饰器模式BeanPostProcessor 增强bean功能

最佳实践建议

  1. 合理选择模式

    • 扩展功能优先使用组合而非继承
    • 复杂对象创建使用建造者模式
  2. 避免过度设计

    // 不推荐:简单场景没必要用工厂模式
    @Bean 
    public Foo simpleFoo() {
        return new Foo(); // 直接new即可
    }
    
  3. 模式组合示例(REST API设计):

    • 工厂模式创建服务实例
    • 策略模式处理不同业务逻辑
    • 装饰器模式添加日志/监控
    • 观察者模式处理业务事件

Spring Boot 通过这些设计模式实现了高度模块化和可扩展的架构,开发者理解这些模式能更高效地使用和扩展框架功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0x25广度优先搜索+0x26广搜变形

1.一般bfs AcWing 172. 立体推箱子 #include<bits/stdc.h> using namespace std; int n,m; char s[505][505]; int vis[3][505][505]; int df[3][4]{{1,1, 2,2},{0,0,1,1}, {0,0,2,2}}; int dx[3][4]{{0,0,1,-2},{0,0,1,-1},{2,-1,0,0}}; int dy[3][4]{{1,-2,0,0},{2,…

java面向对象02:回顾方法

回顾方法及加深 定义方法 修饰符 返回类型 break&#xff1a;跳出switch和return的区别 方法名 参数列表 package com.oop.demo01;//Demo01类 public class Demo01 {//main方法public static void main(String[] args) {}/*修饰符 返回值类型 方法名(...){//方法体return…

数据结构day05

一 栈的应用&#xff08;括号匹配&#xff09; 各位同学大家好&#xff0c;在之前的小结中&#xff0c;我们学习了栈和队列这两种数据结构&#xff0c;那从这个小节开始&#xff0c;我们要学习几种栈和队列的典型应用。这个小节中&#xff0c;我们来看一下括号匹配问题&#xf…

windows中搭建Ubuntu子系统

windows中搭建虚拟环境 1.配置2.windows中搭建Ubuntu子系统2.1windows配置2.1.1 确认启用私有化2.1.2 将wsl2设置为默认版本2.1.3 确认开启相关配置2.1.4重启windows以加载更改配置 2.2 搭建Ubuntu子系统2.2.1 下载Ubuntu2.2.2 迁移位置 3.Ubuntu子系统搭建docker环境3.1安装do…

ImgTool_0.8.0:图片漂白去底处理优化工具

ImgTool_0.8.0 是一款专为Windows设计的‌免费、绿色便携式图片处理工具‌&#xff0c;支持 Windows 7/8/10/11 系统‌。其核心功能为‌漂白去底‌&#xff0c;可高效去除扫描件或手机拍摄图片中的泛黄、灰底及阴影&#xff0c;同时提供智能纠偏、透视校正等辅助功能&#xff0…

BGP路由协议之对等体

IGP 可以通过组播报文发现直连链路上的邻居&#xff0c;而 BGP 是通过 TCP&#xff1a;179 来实现的。BGP 需要手工的方式去配置邻居。不需要直连&#xff0c;只要路由能通就可以建立邻居 IBGP 与 EBGP IBGP :(Internal BGP) :位于相同自治系统的 BGP 路由器之间的 BGP 邻接关…

esp32cam远程图传:AI Thinker ESP32-CAM -》 服务器公网 | 服务器 -》 电脑显示

用AI Thinker ESP32-CAM板子访问公网ip的5112端口并上传你的摄像头拍摄的图像视频数据&#xff0c;并写一段python程序打开弹窗接受图像实现超远程图像传输教程免费 1. 首先你要有一个公网ip也就是去买一台拥有公网的服务器电脑&#xff0c;我买的是腾讯云1年38元的服务器还可…

AIDD-人工智能药物-pyecharts-gallery

给大家安利一个NSC期刊级别的图-pyecharts-gallery 网址 https://gallery.pyecharts.org pyecharts-gallery 英文文档在这 - English Introduction is Here 项目简介 项目基于 pyecharts 2.0.3 版本进行展示Apache ECharts (incubating) 官方实例 项目须知 项目代码结构…

ARM裸机开发——交叉编译器

交叉编译器&#xff1a; 下载&#xff1a; 链接&#xff1a; https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/ 根据核心板的单片机架构进行下载 解压&#xff1a; 首先交叉编译器的压缩包先下载到家目录下的某一个目录中&am…

WPF轮播图动画交互 动画缩放展示图片

WPF轮播图动画交互 动画缩放展示图片 效果如下图&#xff1a; XAML代码&#xff1a; <Window x:Class"Caroursel.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/20…

【AI大模型】大模型RAG技术Langchain4j 核心组件深入详解

目录 一、前言 二、Langchain4j概述 2.1 Langchain4j 是什么 2.2 Langchain4j 主要特点 2.3 Langchain4j 核心组件 2.4 Langchain4j 核心优势 三、Langchanin4j组件应用实战 3.1 前置准备 3.1.1 导入如下依赖 3.1.2 获取apikey 3.1.3 获取官方文档 3.2 聊天组件 3.…

最新如何在服务器中解决FFmpeg下载、安装和配置问题教程(Linux|Windows|Mac|Ubuntu)

最新如何在服务器中解决FFmpeg下载、安装和配置问题教程&#xff08;Linux&#xff5c;Windows&#xff5c;Mac&#xff5c;Ubuntu&#xff09; 摘要&#xff1a; FFmpeg是一个强大的开源工具&#xff0c;广泛应用于音视频处理&#xff0c;支持格式转换、视频剪辑、流媒体推送…

【C语言】结构体 (深入)

前言&#xff1a; 在上一张讲解了结构体的基本知识&#xff0c;在本章深入讲解一下结构体。 如内存对齐&#xff0c;传参&#xff0c;实现尾段。 首先提一个问题吧&#xff0c;如下的代码结果输出是多少&#xff1f; #include <stdio.h> struct s1 {char name;int id…

文件流---------获取文件的内容到控制台

总流程&#xff1a;先创建一个文本文件------->里面写入一些内容&#xff08;纯字母和字母加文字&#xff09;-----------> 然后通过输入流获取文件里面的内容&#xff0c;两种方式。 1.第一种&#xff0c;获取单个的字符 &#xff0c;先创建文件 &#xff0c;java.txt…

【PyTorch项目实战】反卷积(Deconvolution)

文章目录 一、卷积&#xff08;Convolution&#xff09;二、反卷积&#xff08;Deconvolution&#xff09; —— 又称去卷积1. 反卷积&#xff08;Richardson-Lucy&#xff0c;RL&#xff09; —— —— 通过不断迭代更新图像估计值2. 转置卷积&#xff08;Transpose Convoluti…

SpringBoot无法访问静态资源文件CSS、Js问题

在做一个关于基于IDEASpringBootMaveThymeleaf的系统实现实验时候遇到了这个问题一直无法解决 后来看到一篇博客终于解决了。 springboot项目在自动生成的时候会有两个文件夹&#xff0c;一个是static,一个是templates&#xff0c;如果我们使用 <dependency><groupI…

powerbi制作中国式复杂报表

今天主要想实现的功能是使用powerbi制作一个中国式的复杂报表&#xff0c;其中需要多表头&#xff0c;另外需要多个度量值如图我们最终要实现的样式是这样的&#xff1a; 错误示范 因为这些作为多表头的维度需要在同一行上作为不同的列显示所以他们需要来自于同一个字段&#…

ChatGPT-如何让AI写作不那么生硬!

在使用聊天机器人撰写文章时&#xff0c;可能会遇到频繁使用“首先”、“其次”、“再次”等转折连接词&#xff0c;这会让文章显得呆板和机械&#xff0c;降低了阅读体验。 解决这个问题可以尝试以下方式&#xff01; 多样化连接词&#xff1a; 使用更多多样的连接词和过渡短…

C++——继承、权限对继承的影响

目录 继承基本概念 编程示例 1.基类&#xff08;父类&#xff09;Person 代码特点说明 权限对类的影响 ​编辑 编程示例 1. 公有继承 (public inheritance) 2. 保护继承 (protected inheritance) 3. 私有继承 (private inheritance) 重要规则 实际应用 继承基本概…

js中 剩余运算符(Rest Operator )(...)和展开运算符(Spread Operator)(...)的区别及用法

1、基本说明 在JavaScript中&#xff0c;剩余运算符&#xff08;Rest Operator&#xff09;和展开运算符&#xff08;Spread Operator&#xff09;虽然在某些方面有相似之处&#xff0c;但它们各自有不同的用途和功能。下面详细解释这两种运算符的区别&#xff1a; 1.1. 剩余…